我有下表
人(PID,姓名,Dob,AddressId) PID是代理键(自动递增)
地址(AddressId,Line1,Line2,City,State) AddressId是代理键(自动递增)
PersonID(PID)用于我的许多事务表中。由于一个人的地址可能会在一段时间内发生变化,我需要在数据库中存储记录版本,以便我可以根据时间片参考正确的版本。我应该怎么处理它。
我正在考虑使用像这样的解决方案
让我们假设初始人员记录如下
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
现在,我可以在不更改代理键的情况下查询历史数据以及同一表中的当前数据。我不必参考历史表,因此没有轰炸逻辑和表格。
假设我的地址代码是唯一的,这种方法不会让我对表强制执行唯一的键约束。我该如何处理?
请提出不同的方法和反馈。
答案 0 :(得分:0)
我要做的是创建一个包含日期的关系表:
Person_At_Address(PID,AddressId,StartDate,EndDate,LastUpdatedBy,LastUpdatedDate)
并从人员和地址中删除相应的列:
Person(PID, Name, Dob)
Address(AddressId, Line1, Line2, City, State)
现在每当有人更改地址时,您只需在Person_At_Address表中插入一个新行。查询时,您已获得有关历史数据和当前数据的所有信息。
对于NO-CHANGE行的情况,您可以选择多个选项: