假设我在数据库中有一条记录,管理员和普通用户都可以进行更新.
任何人都可以建议一个好的方法/架构如何版本控制此表中的每个更改,以便可以将记录回滚到以前的版本.
假设您有一个FOO
管理员和用户可以更新的表.大多数情况下,您可以针对FOO表编写查询.快乐的时光.
然后,我会创建一个FOO_HISTORY
表.这包含FOO
表格的所有列.主键与FOO和RevisionNumber列相同.有从外键FOO_HISTORY
来FOO
.您还可以添加与修订相关的列,例如UserId和RevisionDate.在所有*_HISTORY
表中(即从Oracle序列或等效表)中以不断增加的方式填充RevisionNumbers .不要依赖于那里只在一秒钟内进行一次更改(即不要放入RevisionDate
主键).
现在,每次更新时FOO
,就在进行更新之前,将旧值插入FOO_HISTORY
.您可以在设计的某个基础级别执行此操作,以便程序员不会意外地错过此步骤.
如果你想从中删除一行,FOO
你有一些选择.级联和删除所有历史记录,或通过标记FOO
为已删除来执行逻辑删除.
当您对当前值感兴趣并且仅偶尔在历史中感兴趣时,此解决方案很好.如果您总是需要历史记录,那么您可以设置有效的开始和结束日期并保留所有记录FOO
.然后每个查询都需要检查这些日期.
我认为您正在寻找版本化数据库记录的内容(正如StackOverflow在有人编辑问题/答案时所做的那样).一个好的起点可能是看一些使用修订跟踪的数据库模型.
想到的最好的例子是维基百科引擎MediaWiki.比较这里的数据库图,特别是修订表.
根据您使用的技术,您必须找到一些好的差异/合并算法.
检查这个问题是否适用于.NET.
在BI世界中,您可以通过向要版本的表添加startDate和endDate来实现此目的.将第一条记录插入表中时,将填充startDate,但endDate为null.插入第二条记录时,还会使用第二条记录的startDate更新第一条记录的endDate.
如果要查看当前记录,请选择endDate为null的记录.
这有时被称为类型2 慢慢变化的维度.另见TupleVersioning
升级到SQL 2008.
尝试在SQL 2008中使用SQL更改跟踪.您可以使用此新功能跟踪数据库中数据的更改,而不是使用时间戳和逻辑删除列黑客.
MSDN SQL 2008更改跟踪
只是想补充说,这个问题的一个好方法是使用Temporal数据库.许多数据库供应商都提供开箱即用或扩展的功能.我已成功使用PostgreSQL 的临时表扩展,但其他人也使用它.每当更新数据库中的记录时,数据库也会保留该记录的先前版本.
两种选择:
有一个历史表 - 每当更新原始数据时,将旧数据插入此历史记录表.
审计表 - 存储前后值 - 仅适用于审计表中的已修改列以及其他信息,例如更新者和何时更新.