是否有在数据库中维护历史记录的最佳实践?

Pet*_*ete 18 database-design

我不经常做数据库工作所以这对我来说是完全不熟悉的领域.

我有一个表,其中包含一组用户可以更新的记录.但是,我现在想要保留其更改的历史记录,以防他们想要回滚.在这种情况下,回滚不是数据库回滚,而是更像是两周后当他们意识到他们犯了错误时还原更改.区别在于我无法完成交易.

当前的做法是使用单独的表,还是仅使用当前表中的标志?

它是一个小型数据库,每个表有5个表,每行<6列,总共<1000行.

Moh*_*ain 12

从这个问题

如何保存MySQL中的记录更新历史记录?

保持版本历史记录的一种简单方法是创建基本相同的表(例如,使用_version后缀).这两个表都有一个版本字段,对于主表,您为每次更新都会增加.版本表将具有复合主键(id,version).

每当您对实际表进行更新时,您还会在版本表中插入包含重复数据的新行.每当您想要查找版本历史记录时,您需要做的就是SELECT*FROM content_version WHERE id = CONTENT_ID ORDER BY version.

如果您使用Doctrine ORM之类的东西,它会有一种行为,可以通过事件侦听器自动执行此操作.你可以在这里查看:http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors : versionable

要么

最简单的解决方案(取决于您的特定需求)可能是为您的表添加更新/插入/删除触发器,因此您可以在插入/更新/删除数据时执行额外的日志记录.这样就可以覆盖对数据库的人工干预......

有关详细信息,请查看http://dev.mysql.com/doc/refman/5.1/en/triggers.html.

  • 触发是最好的处理方式,因为您永远无法保证只能从用户界面更改数据. (5认同)

Har*_*lby 2

沮丧的答案是一种解决方案 - 另一种解决方案是记录更改、更改时间和更改人的审核表。这确实是一个方法问题。如果应用程序表的性能至关重要,并且它们可以使用“活动行”方法大幅增长,那么审计表会更好,因为它将历史记录与活动内容分开(并且我希望修复用户错误更少比“正常”交易更常见)。