如何存储数据的变更历史记录?

4

我需要将数据变更历史记录存储在数据库中。例如,有时某个用户会修改某些数据的属性。期望的结果是我们可以获取一个数据的变更历史记录,如:

Tom    changed title to 'Title one;' 
James  changed name to 'New name'
Steve  added new_tag 'tag23'

基于这些变更历史记录,我们可以获得某些数据的所有版本。
有什么好的方法可以实现这一点?不限于传统关系数据库。

在Oracle中,触发器很适合做这件事情 - 不确定MySQL或SQLServer是否相同 - 您是要以编程方式还是使用本地数据库技术来完成此操作?使用本地数据库技术将是跟踪数据更改最快和最简单的方法。 - Zack Macomber
谢谢,但我不喜欢使用本地数据库技术。 - donnior
2个回答

2
这些通常被称为审计表。我通常使用数据库触发器来管理它们。对于来自源表的每个插入/更新,触发器将数据复制到另一个名为相同表名加上“_AUDIT”的表中(命名约定并不重要,这只是我使用的方式)。ORACLE提供了一种称为日志表的东西。使用ORACLE设计师(或手动),您可以实现同样的功能,通常开发人员在日志/审计表末尾放置_JN。然而,这也是一样的,源表上的触发器将数据复制到审计表中。
编辑: 我还应该指出,您可以创建一个新的单独模式来管理您的审计表,或者您可以将它们保留在与源表相同的模式中。我两种方法都用过,这取决于具体情况。

1

我写了一篇关于各种选项的文章:http://blog.schauderhaft.de/2009/11/29/versioned-data/

如果您不受关系型数据库的限制,那么有一些被称为“仅追加”数据库(我想是这样),它们永远不会更改数据,而只会追加新版本。对于您的情况来说,这听起来非常完美。不幸的是,我不知道任何实现。


我使用过SQLServer做过类似的事情。这可以是一个很好的解决方案,就像Jens所说的那样,你只会不断地添加表数据。它本质上是一个日志表和源表合二为一。但需要注意的是,如果你将源表和审计分开,表数据将增长得更快,可能会导致性能问题。 - northpole
我认为CouchDB是一个仅追加的数据库。 - velop

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