数据库设计:跟踪记录变化

时间:2011-06-28 05:52:57

标签: sql sql-server sql-server-2005 database-design erd

处理完成后不应修改交易。

付款人详细信息可能会随着时间而变化。

如何跟踪变化?

TRANSACTION 
Id(PK) 
PayerId(FK) 
...

PAYER 
Id(PK) 
... 
...

4 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。

如何在更改时将详细信息复制到另一个表中。记录下来,您将知道在该日期之前将此信息用于交易。

或者,您可以将所有这些数据去规范化为表格以进行报告。

或者如何将新表链接到客户详细信息。当此更新链接到新行并在该行链接到上一行时。您将能够(慢慢地)以这种方式提取数据。

答案 1 :(得分:1)

你最好的选择是做两件事之一。将事务中的数据存储在TRANSACTION表或TRANSACTION DETAILS表中。这不是非规范化。您需要截至发生时的数据,并将其保留为PAYER表的连接,随时间变化意味着您将获得不正确的数据。数据在多个记录中重复的事实并不比CA在具有状态字段的地址表中多次出现更重要。您还应该存储PAYER ID,以便在需要时查找当前数据。这是最简单的解决方案。

另一种解决方案是添加一种基于时间查找数据的方法。这更复杂,必须非常小心,否则您将失去数据完整性或具有非常稳定的报告结果。我最好找到你是否有Payor的相关表格。首先设置PAYOR,它基本上具有PAYORID和PAYOR DETAILS,它们将具有基于时间的数据。这样,您可以将外键约束强制执行到PAYOR(这样您可以在需要时查找当前详细信息),但在发生地址或名称等更改时仍会在PAYORDETAILS表中存储多个记录。您还需要每个记录的开始日期和结束日期,并触发以确保开始/结束日期不重叠。如果您有多个地址,那么它就变得更加复杂,因为每个地址都必须有一个地址类型,其中一次只能有一个地址(您不希望报告显示您将产品发送到三个地址)。您的所有查询都应考虑检查开始日期和结束日期,通常最好设置一个始终只显示当前记录的视图。随着时间的推移,这种情况设置和维护要复杂得多,并且更容易出现错误,这些错误可能导致您没有将正确的数据附加到事务中。

答案 2 :(得分:0)

您可以使用触发器来跟踪您的更改。将更改的历史记录保存在新表中。

触发器的重要性在于,只要表记录发生任何变化,我们就可以创建变更的历史记录。

Sample code for triggers

对于更新的数据,您可以从 Inserted

中选择记录

对于过时的数据,您可以从 Deleted 表中选择记录

创建新表时,可以避免在此表中使用外键。直接将数据保存到此表将帮助您在检索历史数据时保持查询快速

答案 3 :(得分:0)

我强烈建议您将“时间”作为付款人实体中的头等概念。 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
.....