假设我在数据库中有一条记录,并且管理员和普通用户都可以进行更新。
任何人都可以建议一个好的方法/架构来控制此表中的每个更改,以便可以将记录回滚到以前的修订吗?
最佳答案
假设您有一个管理员和用户可以更新的 FOO
表。大多数时候,您可以针对 FOO 表编写查询。快乐的日子。
然后,我将创建一个 FOO_HISTORY
表。其中包含 FOO
表的所有列。主键与 FOO 相同,加上一个 RevisionNumber 列。有一个从 FOO_HISTORY
到 FOO
的外键。您还可以添加与修订相关的列,例如 UserId 和 RevisionDate。以不断增加的方式在所有 *_HISTORY
表(即来自 Oracle 序列或等效表)中填充 RevisionNumber。不要依赖一秒钟内只有一次更改(即不要将 RevisionDate
放入主键中)。
现在,每次更新 FOO
时,在执行更新之前将旧值插入到 FOO_HISTORY
中。您可以在设计中的某个基本级别上执行此操作,以便程序员不会意外地错过此步骤。
如果您想从 FOO
中删除一行,您有一些选择。级联并删除所有历史记录,或者通过将 FOO
标记为已删除来执行逻辑删除。
当您主要对当前值感兴趣而只是偶尔对历史值感兴趣时,此解决方案非常有用。如果您始终需要历史记录,那么您可以输入有效的开始和结束日期,并将所有记录保留在 FOO
本身中。每个查询都需要检查这些日期。
关于database-design - 如何对数据库中的记录进行版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/323065/