Nie*_*sma 158 architecture database-design
假设我在数据库中有一条记录,管理员和普通用户都可以进行更新.
任何人都可以建议一个好的方法/架构如何版本控制此表中的每个更改,以便可以将记录回滚到以前的版本.
WW.*_*WW. 154
假设您有一个FOO管理员和用户可以更新的表.大多数情况下,您可以针对FOO表编写查询.快乐的时光.
然后,我会创建一个FOO_HISTORY表.这包含FOO表格的所有列.主键与FOO和RevisionNumber列相同.有从外键FOO_HISTORY来FOO.您还可以添加与修订相关的列,例如UserId和RevisionDate.在所有*_HISTORY表中(即从Oracle序列或等效表)中以不断增加的方式填充RevisionNumbers .不要依赖于那里只在一秒钟内进行一次更改(即不要放入RevisionDate主键).
现在,每次更新时FOO,就在进行更新之前,将旧值插入FOO_HISTORY.您可以在设计的某个基础级别执行此操作,以便程序员不会意外地错过此步骤.
如果你想从中删除一行,FOO你有一些选择.级联和删除所有历史记录,或通过标记FOO为已删除来执行逻辑删除.
当您对当前值感兴趣并且仅偶尔在历史中感兴趣时,此解决方案很好.如果您总是需要历史记录,那么您可以设置有效的开始和结束日期并保留所有记录FOO.然后每个查询都需要检查这些日期.
Dav*_*ley 27
在BI世界中,您可以通过向要版本的表添加startDate和endDate来实现此目的.将第一条记录插入表中时,将填充startDate,但endDate为null.插入第二条记录时,还会使用第二条记录的startDate更新第一条记录的endDate.
如果要查看当前记录,请选择endDate为null的记录.
这有时被称为类型2 慢慢变化的维度.另见TupleVersioning
升级到SQL 2008.
尝试在SQL 2008中使用SQL更改跟踪.您可以使用此新功能跟踪数据库中数据的更改,而不是使用时间戳和逻辑删除列黑客.
只是想补充说,这个问题的一个好方法是使用Temporal数据库.许多数据库供应商都提供开箱即用或扩展的功能.我已成功使用PostgreSQL 的临时表扩展,但其他人也使用它.每当更新数据库中的记录时,数据库也会保留该记录的先前版本.
小智 5
AlokAudit table上面建议的,我想在我的帖子中解释一下。
我在我的项目中采用了这种无模式的单表设计。
架构:
该表可以将每个表的历史记录全部保存在一个位置,并将完整的对象历史记录保存在一条记录中。该表可以使用数据更改的触发器/挂钩来填充,存储目标行的旧值和新值快照。
这种设计的优点:
这种设计的缺点: