0

我有下表

  • Person(PID, Name, Dob, AddressId) PID 是代理键(自动递增)

  • Address(AddressId, Line1, Line2, City, State) AddressId 是代理键(自动递增)

我的很多事务表中都使用了 PersonID (PID)。由于一个人的地址可能会随着时间的推移而改变,我需要将记录版本存储在数据库中,以便我可以根据时间片引用正确的版本。我该怎么处理。

我正在考虑有这样的解决方案

  • 使用同一张表来存储历史,例如
  • 人员(PID、姓名、Dob、AddressId)
  • 地址(AddressId、Line1、Line2、城市、州、StartDate、EndDate、LastUpdatedBy、LastUpdatedDate)

让我们假设人的初始记录如下

Person(100, X, Y, 110)
Address(110, A, B, C, D, 2011-01-01, 9999-12-31, Y, 2011-01-01)

现在地址在2012年更改为 PID 100。我正在考虑

Address(320, A, B, C, D, 2011-01-01, 2012-06-01, Y, 2011-01-01) - INSERT
Address(110, A, B, Q, D, 2012-06-01, 9999-12-31, Z, 2012-06-01) - UPDATE

如果地址在2014 年再次更改为 PID 100。它看起来像

Address(740, A, B, Q, D, 2012-06-01, 2014-06-01, Y, 2012-01-01) - INSERT
Address(320, A, B, C, D, 2011-01-01, 2012-06-01, Y, 2011-01-01) - NO CHANGE
Address(110, A, B, N, D, 2014-06-01, 9999-12-31, R, 2012-06-01) - UPDATE

现在我可以在不更改代理键的情况下从同一个表中查询历史数据和当前数据。我不必参考历史表格,因此不会轰炸逻辑和表格。

假设我的地址代码是唯一的,这种方法不会让我对表强制执行唯一键约束。我该如何处理?

请就此提出不同的方法和反馈。

4

1 回答 1

0

我要做的是制作一个包含日期的关系表:

Person_At_Address(PID,AddressId,StartDate,EndDate,LastUpdatedBy,LastUpdatedDate)

并从 Person 和 Address 中删除相应的列,从而产生:

Person(PID, Name, Dob)
Address(AddressId, Line1, Line2, City, State)

现在,每当有人更改地址时,您只需在 Person_At_Address 表中插入一个新行。查询时,您可以获得有关历史和当前数据的所有信息。

至于您的 NO-CHANGE 行的情况,您有多种选择可以将其拉出:

  • 如果该时间片不存在任何行,您可以安排在给定检查点及时插入行的计划作业。然后选择查询为您提供上述输出。
  • 您还可以在运行查询后通过填写应用程序中缺少的行来创建类似的显示。这也相当简单。
于 2014-12-31T10:15:19.167 回答