我有下表
-
人(PID,姓名,Dob,地址ID) PID是代理键(自动递增)
地址 (地址 ID、第 1 行、第 2 行、城市、州) 地址 ID 是代理键(自动递增)
PersonID (PID) 用于我的大量交易表中。由于一个人的地址可能会在一段时间内发生变化,我需要将记录版本存储在数据库中,以便我可以根据时间片引用正确的版本。我应该如何处理它。
我正在考虑有这样的解决方案
- 使用同一张表存储历史记录例如
- 人(PID, 姓名, Dob, AddressId) 地址
- (地址 ID, 第 1 行, 第 2 行, 城市, 州, 开始日期, 结束日期,上次更新者,上次更新日期)
让我们假设人员的初始记录如下
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
如果 PID 100 的地址在 2014 年再次更改。它看起来像
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
现在,我可以查询历史数据以及同一表中的当前数据,而无需更改代理键。我不必参考历史表,因此不会轰炸逻辑和表格。
此方法不允许我在表上强制实施唯一键约束,假设我的地址代码是唯一的。我该如何处理?
请就此提出不同的方法和反馈。
我要做的是制作一个包含日期的关系表:
Person_At_Address(PID,AddressId,StartDate,EndDate,LastUpdatedBy,LastUpdatedDate)
并从人员和地址中删除相应的列,从而产生:
Person(PID, Name, Dob)
Address(AddressId, Line1, Line2, City, State)
现在,每当有人更改地址时,您只需在Person_At_Address表中插入新行即可。查询时,您已经获得了有关历史和当前数据的所有信息。
至于您的NO-CHANGE行的情况,您有多种选择可以将其拉出:
- 您可以有一个计划作业,如果该时间片没有行,则在给定的检查点插入行。然后选择查询为您提供上述输出。
- 您还可以在运行查询后通过填写应用程序中缺少的行来创建类似的显示。这也相当简单。