2013-02-09 63 views
0

我想模拟一个新的数据库。其中一个要求是保留不同行的版本。这里的2个版本的同一对象的示例:使用SQL Server解决行版本化

ID | UID         | Name | Date 
-------------------------------------------------------------- 
1 | 734FD814-024D-4795-AFD0-34FECF89A13A | Alpha | 2013-02-08 
2 | 734FD814-024D-4795-AFD0-34FECF89A13A | Bravo | 2013-02-09 

为了与此表作为参考我需要指定一个主键的外键。这两个候选人是IDUID,第一个是auto increment号码,第二个是每个对象手动生成的唯一标识符。

限制:

当选择ID作为主键:

  • 在创建对象的新版本,旧版本的所有引用变得无效,必须更新
  • 手动更新每个插页上的所有参考文献不是一个选项,很重

当选择UID作为主键:

  • UID不是唯一的,因此不能单独使用它,必须使用其他字段相关联,并且复杂的主键
  • 所有其他将被使用的字段内使用的可改变外键参考的刹车。

任何有关克服这些限制的最佳方法(尽可能最轻)的建议?

PS:我正在使用OrmLite对使用POCO对象的数据库建模。

+0

保持多个版本的原因是什么?为了保持对特定版本的引用,或纯粹是为了追踪历史变化? – 2013-02-09 11:18:12

+0

你必须保持在同一个表中的版本?或者可以将它存储在某种历史表中 – WKordos 2013-02-09 11:52:39

回答

1

这是财务应用程序中非常常见的情况。一个很好的方法是将一行标记为活动。例如:

ObjectID, StartDt, EndDt, ...other columns... 

其中[StartDt, EndDt>标志着时间间隔,其中该行是“实际的”的行。你可以加入像:

join YourTable yt 
on  yt.ObjectId = otherTable.ObjectID 
     and yt.StartDt is not null 
     and yt.EndDt is null -- Select active row 
0

不会将版本更改为版本(可能只是ID)的字段可以放入另一个表中。这是你链接的表格。特定于版本的信息在另一个表中。为了帮助您加入最新的版本信息,您可以在该表中保留最新的IsLatest标志。