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

时间:2013-12-16 11:33:55

标签: sql sql-server database-design

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

MasterTable

  • ID

DetailsTable

  • ID
  • MasterTableID
  • CreatedOn
  • 标题
  • 内容

虽然它适用于我的目的,只有一个ID字段的MasterTable感觉不对,但是我没有其他方法可以将详细记录链接在一起。

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

2 个答案:

答案 0 :(得分:1)

请忽略MasterTable。

通过使用相同的ID列值,您的DetailsTable中的行仍将“链接在一起”,就像您所说的那样。

您可能想要做的任何其他有用的“链接”(例如将一行链接到其直接后继者或前任者)都无法通过拥有该MasterTable来实现。它没有任何成就(除非你想要其中有ID,没有详细信息,因此从未创建过ID,这似乎不太可能)。把它拿出来。

答案 1 :(得分:1)

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

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

EntityHistory 表:EntityId - PK,版本 - PK,CreatedOn,标题,内容

关于的一些想法:

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