在OLTP系统中实现行版本控制的数据模型

时间:2014-12-31 02:27:44

标签: sql database-design normalization data-modeling scd

我有下表

  • 人(PID,姓名,Dob,AddressId) PID是代理键(自动递增)

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

PersonID(PID)用于我的许多事务表中。由于一个人的地址可能会在一段时间内发生变化,我需要在数据库中存储记录版本,以便我可以根据时间片参考正确的版本。我应该怎么处理它。

我正在考虑使用像这样的解决方案

  • 使用相同的表存储历史记录 e.g。
  • 人(PID,姓名,Dob,AddressId)
  • 地址(AddressId,Line1,Line2,City,State,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

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

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

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

1 个答案:

答案 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行的情况,您可以选择多个选项:

  • 如果该时间片段没有行,您可以让预定作业在给定检查点及时插入行。然后选择查询将为您提供上述输出。
  • 您还可以在运行查询后通过填写应用程序中缺少的行来创建类似的显示。这也很简单。