database-design - 如何对数据库中的记录进行版本控制

标签 database-design architecture versioning auditing

假设我在数据库中有一条记录,并且管理员和普通用户都可以进行更新。

任何人都可以建议一个好的方法/架构来控制此表中的每个更改,以便可以将记录回滚到以前的修订吗?

最佳答案

假设您有一个管理员和用户可以更新的 FOO 表。大多数时候,您可以针对 FOO 表编写查询。快乐的日子。

然后,我将创建一个 FOO_HISTORY 表。其中包含 FOO 表的所有列。主键与 FOO 相同,加上一个 RevisionNumber 列。有一个从 FOO_HISTORYFOO 的外键。您还可以添加与修订相关的列,例如 UserId 和 RevisionDate。以不断增加的方式在所有 *_HISTORY 表(即来自 Oracle 序列或等效表)中填充 RevisionNumber。不要依赖一秒钟内只有一次更改(即不要将 RevisionDate 放入主键中)。

现在,每次更新 FOO 时,在执行更新之前将旧值插入到 FOO_HISTORY 中。您可以在设计中的某个基本级别上执行此操作,以便程序员不会意外地错过此步骤。

如果您想从 FOO 中删除一行,您有一些选择。级联并删除所有历史记录,或者通过将 FOO 标记为已删除来执行逻辑删除。

当您主要对当前值感兴趣而只是偶尔对历史值感兴趣时,此解决方案非常有用。如果您始终需要历史记录,那么您可以输入有效的开始和结束日期,并将所有记录保留在 FOO 本身中。每个查询都需要检查这些日期。

关于database-design - 如何对数据库中的记录进行版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/323065/

相关文章:

mysql - 数据库模式一列条目引用了另一个表中的多行

javascript - 在 IndexedDB 中使用有序列表

javascript - 位运算符在 2^31 之后停止工作

architecture - SOA 六边形/洋葱架构中的适配器模式

.net - 使用 TFS 检测 .NET 代码中的重大更改?

vb.net - 类版本控制

带有过滤器的电子商务网站的数据库设计

database - 如何在一个数据库字段中插入多个条目

SPA 中的 Html 标记抽象和一致性

database-design - 内容的 CMS 版本控制策略