事务处理后不应修改。
付款人的详细信息可能会随着时间而改变。
你如何跟踪变化?
TRANSACTION
Id(PK)
PayerId(FK)
...
PAYER
Id(PK)
...
...
事务处理后不应修改。
付款人的详细信息可能会随着时间而改变。
你如何跟踪变化?
TRANSACTION
Id(PK)
PayerId(FK)
...
PAYER
Id(PK)
...
...
有很多方法可以做到这一点。
您如何在更改时将详细信息复制到另一个表中。记录这一点,您就会知道在该日期之前使用此信息进行交易。
或者,您可以将所有这些数据反规范化到一个表格中以进行报告。
或者一个链接到客户详细信息的新表怎么样。当此更新链接到新行并在该行上链接到上一行时。您将能够(慢慢地)以这种方式提取数据。
你最好的选择是做两件事之一。将事务发生时的数据存储在 TRANSACTION 表或 TRANSACTION DETAILS 表中。这不是非规范化。您需要数据发生时的数据,并将其保留为与 PAYER 表的连接,该表会随着时间的推移而变化,这意味着您将拥有不正确的数据。数据在多条记录中重复的事实并不比 CA 在带有状态字段的地址表中出现多次更重要。您还应该存储 PAYER ID,以便在需要时查找当前数据。这是最简单的解决方案。
另一种解决方案是添加一种基于时间查找数据的方法。这更复杂,必须非常小心地完成,否则您将失去数据完整性或获得非常奇怪的报告结果。如果您有付款人的相关表格,我最好找到。首先设置 PAYOR,它基本上具有 PAYORID 和 PAYOR DETAILS,它们将具有基于时间的数据。这样,您可以对 PAYOR 实施外键约束(因此您可以在需要时查找当前详细信息),但在地址或名称等发生更改时仍将多条记录存储在 PAYORDETAILS 表中。您还需要每个记录的开始日期和结束日期,并触发以确保开始/结束日期不重叠。例如,如果您有多个地址,那么它会变得更加复杂,因为每个地址都必须有一个地址类型,一次只能激活一个(您不希望您的报告显示您将产品运送到三个地址)。您的所有查询都应考虑检查开始和结束日期,通常最好设置一个始终只显示当前记录的视图。随着时间的推移,这种情况的设置和维护要复杂得多,而且更有可能出现错误,导致您没有将正确的数据附加到事务中。
我强烈建议在您的付款人实体中将“时间”作为一流的概念。Damien_the_unbeliever 的“临时表”解决方案实现了这一点,但也有替代实现。
过去,我通过在付款人表中添加有效窗口并将交易日期与该窗口进行比较来解决此类问题。
TRANSACTION
Id(PK)
PayerId
TransactionDate
...
PAYER
Id
ValidFrom
ValidUntil
....
此模式允许您找出交易时的付款人;这确实意味着您不能依赖参照完整性(因为 Payer 表中的 ID 不是有效的主键 - 有多个具有相同 ID 的记录。
一个转折是:
TRANSACTION
Id(PK)
PayerId(FK)
...
PAYER
Id(PK)
PAYER_DETAIL
ID(FK)
PayerID (FK)
ValidFrom
ValidUntil
.....
您可以使用触发器来跟踪您的更改。将您的更改历史记录在新表中。
触发器的重要性在于,每当表记录发生任何变化时,我们都可以对所做的更改进行历史记录。
对于更新的数据,您可以从Inserted
表中选择记录
对于过时的数据,您可以从Deleted
表中选择记录
创建新表时,可以避免在该表中使用外键。直接将数据保存到此表中将有助于您在检索历史数据的同时保持快速查询