当前位置:  开发笔记 > 数据库 > 正文

如何版本控制数据库中的记录

如何解决《如何版本控制数据库中的记录》经验,为你挑选了6个好方法。

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

任何人都可以建议一个好的方法/架构如何版本控制此表中的每个更改,以便可以将记录回滚到以前的版本.



1> WW...:

假设您有一个FOO管理员和用户可以更新的表.大多数情况下,您可以针对FOO表编写查询.快乐的时光.

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

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

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

当您对当前值感兴趣并且仅偶尔在历史中感兴趣时,此解决方案很好.如果您总是需要历史记录,那么您可以设置有效的开始和结束日期并保留所有记录FOO.然后每个查询都需要检查这些日期.


我woyuld建议您实际插入_new_数据,而不是之前的数据,因此历史表包含所有数据.虽然它存储了redyundent数据,但它消除了在需要历史数据时处理两个表中的搜索所需的特殊情况.
就个人而言,我建议不要删除任何内容(将其推迟到特定的内务活动)并使用"操作类型"列来指定是否插入/更新/删除.对于删除,您可以正常复制行,但在"操作类型"列中添加"删除".
@Hydrargyrum保存当前值的表将比历史表的视图表现更好.您可能还希望定义引用当前值的外键.
`有一个从FOO_HISTORY到FOO'的外键:坏主意,我想删除foo中的记录而不改变历史记录.历史表应该在正常使用时只插入.

2> CMS..:

我认为您正在寻找版本化数据库记录的内容(正如StackOverflow在有人编辑问题/答案时所做的那样).一个好的起点可能是看一些使用修订跟踪的数据库模型.

想到的最好的例子是维基百科引擎MediaWiki.比较这里的数据库图,特别是修订表.

根据您使用的技术,您必须找到一些好的差异/合并算法.

检查这个问题是否适用于.NET.



3> Dave Neeley..:

在BI世界中,您可以通过向要版本的表添加startDate和endDate来实现此目的.将第一条记录插入表中时,将填充startDate,但endDate为null.插入第二条记录时,还会使用第二条记录的startDate更新第一条记录的endDate.

如果要查看当前记录,请选择endDate为null的记录.

这有时被称为类型2 慢慢变化的维度.另见TupleVersioning



4> D3vtr0n..:

升级到SQL 2008.

尝试在SQL 2008中使用SQL更改跟踪.您可以使用此新功能跟踪数据库中数据的更改,而不是使用时间戳和逻辑删除列黑客.

MSDN SQL 2008更改跟踪



5> wuher..:

只是想补充说,这个问题的一个好方法是使用Temporal数据库.许多数据库供应商都提供开箱即用或扩展的功能.我已成功使用PostgreSQL 的临时表扩展,但其他人也使用它.每当更新数据库中的记录时,数据库也会保留该记录的先前版本.



6> alok..:

两种选择:

    有一个历史表 - 每当更新原始数据时,将旧数据插入此历史记录表.

    审计表 - 存储前后值 - 仅适用于审计表中的已修改列以及其他信息,例如更新者和何时更新.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有