为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

不负相思意 2019-10-23 14:32:41

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

任何人都可以提出一种好的方法/体系结构来控制该表中的每个更改的版本,以便可以将记录回滚到以前的修订版。


查看完整描述

3 回答

?
尚方宝剑之说

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

然后,我将创建一个FOO_HISTORY表。这具有表的所有列FOO。主键与FOO相同,外加一个RevisionNumber列。有一个从FOO_HISTORY到的外键FOO。您可能还会添加与修订有关的列,例如UserId和RevisionDate。以越来越多的方式在所有*_HISTORY表中填充RevisionNumbers (即从Oracle序列或等效表中)。不要只依赖在一秒钟内进行一次更改(即不要放入RevisionDate主键中)。

现在,每次更新时FOO,在进行更新之前,您都将旧值插入FOO_HISTORY。您需要在设计的某个基本级别上执行此操作,以使程序员不会意外遗漏此步骤。

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

当您对当前值非常感兴趣并且仅对历史记录感兴趣时,此解决方案是不错的选择。如果您始终需要历史记录,则可以输入有效的开始日期和结束日期,并将所有记录保留在FOO其内。然后,每个查询都需要检查那些日期。


查看完整回答
反对 回复 2019-10-23
?
倚天杖

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


想到的最好的例子是Wikipedia引擎MediaWiki。比较这里的数据库图,尤其是修订表。


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


检查此问题是否适用于.NET。


查看完整回答
反对 回复 2019-10-23
?
慕桂英4014372

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


当您要查看当前记录时,请选择endDate为null的记录。


有时称为2型缓慢变化尺寸。另请参见TupleVersioning


查看完整回答
反对 回复 2019-10-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信