数据库设计:存储记录编辑历史(时态数据)



我想将时态信息存储在数据库中。我想出了下面的设计。这是最好的方法吗?

主表

  • ID

详细信息表

  • ID
  • MasterTableID
  • 创建日期
  • 标题
  • 内容

虽然这对我来说是可行的,但有一个只有ID字段的MasterTable感觉不太好,但我看不到其他方法可以将Details记录链接在一起。

有更清洁/标准的方法吗?

一个想法是设计如下两个表:

实体表:EntityId-PK,标题,内容

EntityHistory表:EntityId-PK,Version-PK,CreatedOn,Title,Content

关于的一些想法:

  • 通常,您只需要使用行的当前版本,因此在加入数据时,查询不会考虑以前的版本等。从长远来看,这可能会对性能产生巨大影响,统计数据不准确,数据选择性可能会对索引选择产生负面影响,等等
  • 如果经常使用当前值和历史值,则可以将视图定义为两个表的并集
  • 如何管理添加新版本?在事务中,从EntityHistory中的Entity复制值(通过增加版本),然后用新值更新Entity行。或者,您可以在Entity表上定义一个触发器,该触发器将执行幕后操作
  • 使用rowversion列:http://technet.microsoft.com/en-us/library/ms182776(v=sql.105).aspx

只需省略MasterTable。

DetailsTable中的行仍将通过具有相同的ID列值而"链接在一起",正如您所称。

你可能想做的任何其他有用的"链接"(例如,将一行链接到它的直接继任者或前任)都不是通过拥有MasterTable来实现的。它什么也没做(除非你想在里面有ID,因为没有详细信息,所以ID从来没有创建过,这似乎不太可能)。别提了。

最新更新