2012-02-28 124 views
4

我需要将数据的更改历史记录存储在数据库中。例如,有些时候用户修改某些数据的某些属性。预期的结果是基于这些变化的历史,我们可以得到所有版本的一些数据我们可以得到改变历史的一个数据,如如何存储数据的更改历史记录?

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

任何好主意,以实现这一目标?不限于传统的关系数据库。

+0

在Oracle中,触发器非常适合这样做 - 不确定它在MySQL或SQLServer中是否相同 - 您是否希望以编程方式或使用本机数据库技术来完成此操作?使用本地数据库技术将是追踪数据变化的最快速和最可能的最简单方式。 – 2012-02-28 15:32:04

+0

谢谢,但我不喜欢使用本地数据库技术。 – donnior 2012-02-28 15:34:13

回答

2

这些通常被称为审计表。我通常如何管理这个数据库是使用触发器。对于来自源表的每一个插入/更新,触发器都会将数据复制到另一个表中,并在表中添加一个_AUDIT(命名约定无关紧要,这正是我所使用的)。 ORACLE为您提供了一些称为日记表的东西。使用ORACLE设计器(或手动)可以达到同样的效果,而且开发人员通常会在日志/审计表的末尾放置_JN。但是,这与源表上的触发器将数据复制到审计表中的情况相同。

编辑: 我还应该注意,您可以创建一个新的独立模式来管理您的审计表,或者您可以使用源表将它们保留在模式中。我都这样做,这取决于情况。

1

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

如果你不依赖于关系数据库中,有东西叫做“追加只有”数据库(我认为),它永远不会改变的数据,但只追加新版本。对于你的情况,这听起来很完美。不幸的是我不知道有任何实现。

+0

我使用SQLServer做了类似的事情。这可能是一个很好的解决方案,就像Jens所说,你只是添加了表格数据。它本质上是一个日记表和一个源表。但应该指出,如果将源与审核分开并且可能导致性能问题,那么表格数据的增长速度会快得多。 – northpole 2012-02-28 15:47:36

+0

我认为CouchDB是一个仅追加数据库 – velop 2016-06-22 17:57:59

相关问题