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

3

我想在数据库中存储时间信息。我已经设计了以下方案。这是最好的方法吗?

主表

  • ID

详细信息表

  • ID
  • 主表ID
  • 创建时间
  • 标题
  • 内容

虽然这个方案对我的目的有效,但仅具有ID字段的主表并不感觉正确,但我无法找到其他链接详细信息记录的方式。

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


你能提供一些关于你试图做什么/存储在这个数据库中的细节吗?我不太明白你使用这些实体建模的内容。 - nestedloop
我试图将其抽象化。无论我建模的是什么概念,这个概念都应该适用于任何数据。 - Three Value Logic
2个回答

1

只需省略MasterTable。

您的DetailsTable中的行仍将通过具有相同ID列值来"连接在一起"。

任何其他有用的“链接”(例如将行链接到其直接后继或前身)都无需该MasterTable即可实现。它并没有起到任何作用(除非您希望在其中拥有ID,而没有Details,即ID从未被创建过,这似乎相当不可能)。把它省略掉。


1
他们可能需要主表来生成ID,但是在SQL Server的后续版本中,这可以用序列来替代。 - RBarryYoung
遗憾的是,这正是它存在的原因。最初我在主表中有标题和内容,但意识到即使那也可能会改变。 - Three Value Logic
用户如何识别他正在维护数据的事物? - Erwin Smout

1
一个想法是设计两个表如下:
实体表:EntityId - PK,Title,Content
实体历史表:EntityId - PK,Version - PK,CreatedOn,Title,Content
一些思考:
通常情况下,您只需要使用行的当前版本,因此在连接数据等操作时,查询不会考虑以前的版本。从长远来看,这可能会对性能产生巨大影响,统计数据将不准确,数据选择性可能会对索引选择产生负面影响等。
如果您经常使用当前值和历史值,可以定义一个视图作为两个表的联合。
如何管理添加新版本?在事务内,通过增加版本号将Entity中的值复制到EntityHistory,然后使用新值更新Entity行。或者,您可以在Entity表上定义一个触发器,它将在背后完成操作。
使用rowversion列:http://technet.microsoft.com/en-us/library/ms182776(v=sql.105).aspx

我想到了类似的东西。我的纯粹主义者不喜欢将相同的信息分散在多个表中(实体中的当前记录,实体历史中的历史记录),但是出于性能考虑,我选择了这种方法。 - Three Value Logic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接