Database 如何存储数据';改变历史?
我需要在数据库中存储数据的更改历史记录。例如,某个时间某个用户修改某些数据的某些属性。预期的结果是我们可以得到一个数据的变化历史,比如Database 如何存储数据';改变历史?,database,Database,我需要在数据库中存储数据的更改历史记录。例如,某个时间某个用户修改某些数据的某些属性。预期的结果是我们可以得到一个数据的变化历史,比如 Tom changed title to 'Title one;' James changed name to 'New name' Steve added new_tag 'tag23' 基于这些变更历史,我们可以得到一些数据的所有版本 有什么好主意可以做到这一点吗?不局限于传统的关系数据库 这些通常称为审计表。我通常是如何在数据库上使用触发器来
Tom changed title to 'Title one;'
James changed name to 'New name'
Steve added new_tag 'tag23'
基于这些变更历史,我们可以得到一些数据的所有版本
有什么好主意可以做到这一点吗?不局限于传统的关系数据库 这些通常称为审计表。我通常是如何在数据库上使用触发器来管理它的。对于源表的每次插入/更新,触发器都会将数据复制到另一个名为相同表名的表中,并附加一个_审计(命名约定无关紧要,它只是我使用的)。ORACLE为您提供了一种称为日志表的功能。使用ORACLE designer(或手动)可以实现同样的效果,开发人员通常会在日志/审计表的末尾添加一个_JN。但是,这与源表上的触发器将数据复制到审核表中的情况相同 编辑:
我还应该注意,您可以创建一个新的单独的模式来管理审计表,或者将它们与源表一起保存在模式中。我两者都做,这取决于具体情况。我写了一篇关于各种选择的文章:
如果您没有绑定到关系数据库,那么有一些称为“仅追加”数据库(我认为),它们从不更改数据,只追加新版本。对你来说,这听起来很完美。不幸的是,我不知道任何实现 在Oracle中,触发器很适合这样做—不确定在MySQL或SQLServer中是否相同—您是希望以编程方式还是使用本机数据库技术来实现这一点?使用本机数据库技术将是跟踪数据更改的最快也是最简单的方法。谢谢,但我不喜欢使用本机数据库技术。我使用SQLServer也做过类似的事情。这是一个很好的解决方案,正如Jens所说,您只需要向表中添加数据。它本质上是一个日志表和一个源表。但是应该注意的是,如果将源代码与审核分离,那么表数据的增长速度会快得多,并且可能会导致性能问题