Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何存储数据';改变历史?_Database - Fatal编程技术网

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所说,您只需要向表中添加数据。它本质上是一个日志表和一个源表。但是应该注意的是,如果将源代码与审核分离,那么表数据的增长速度会快得多,并且可能会导致性能问题