在MySQL数据库中对关系数据进行版本控制的模式?


12

我正在尝试为项目找到一种方法,用户可以在其中编辑记录,并能够查看这些记录的过去版本。这是一个使用列表的简化示例架构:

TABLE list (
  id int auto_increment primary key,
  user_id int, 
  title varchar(255)
);

TABLE list_tasks (
  id int auto_increment primary key,
  list_id int,
  title varchar(255),
  order int,
  is_complete tinyint
);

因此,用户可能会进来并对列表进行几次编辑(例如,添加或删除任务,重新排序任务,标记某些任务完成,重命名任务等),然后保存它们。此时,我想生成列表和任务的“版本2”,并让他们能够查看以前的版本,但是当他们访问列表时,请始终获取最新版本。

是否存在用于以这种方式在MySQL数据库中处理版本控制数据的通用方法/设计模式?


请注意,它们是为此的库。例如,如果您使用Hibernate,则有Hibernate Envers。因此,如果您有一些为您处理DAO的框架,请尝试搜索是否存在类似的内容。
Walfrat

Answers:


9

要在数据库中执行此操作很常见。尽管您正在曲解,但您仍想跟踪项目列表的修订。

一种方法是更改​​结构,例如

Alter table lists add revision_id integer;
Alter table list_tasks add revision_id integer;

Create Table revisions
{
   id int autoincrement... (revision id)
   list_id int...
   revdate datetime...
}

当用户保存其列表时,请在上revisions表中创建一个新修订,并将该值分配给中的列表项list_tasks,然后将其分配给in 的修订ID,lists以将该ID标记为“当前”修订。用户编辑项目时,请勿编辑现有项目-而是插入具有新修订版ID的新项目,并list使用该修订版更新表以将其标记为当前版本。

然后,要列出当前项目,请列出lists表中指定的当前修订ID中的项目。要浏览以前的版本,您可以从修订表中获得列表的先前修订版本列表,然后根据该ID列出各个项目。


5

此解决方案使用单独的审核表。它具有优点和缺点。您可能希望从主表中删除旧记录。性能提升可能微不足道。

将以下字段添加到每个审核表:

AddUserID      int <whatever your system uses>
AddDateTime    datetime
UpdateUserID   int <whatever your system uses>
UpdateDateTime datetime
CurrentVersion int
IsDeleted      bit

每次数据更改时,您将需要更新这些字段。CurrentVersion递增1(它可以用作锁定记录的一种方式,但这是另一个问题。)IsDeleted提供了“软删除”功能,以便将来可以引用。

单独的审核表 每个表应具有对应的表的_Archive或_History版本。这些可能不需要以相同的方式编制索引。显然,单个主键字段将不适用。您应该能够使用ID字段和UpdateDateTime来组合键。

使用触发器(这将解决在代码内部或外部所做的更改。您可以决定是否适合您的情况。)或其他编码,在追加,更新或删除记录时,将记录的副本放置在归档中/历史表。保留所有版本和其他审核字段。这将告诉您什么用户什么时候做了什么。可以将该表与自身进行比较,以查看记录何时更改或趋势。

在过去的几年中,我已经很好地看到了这项工作。我想听听我可能没有考虑的缺点。


我和GrandMasterB都赞成,两者都很好,要使用哪一个取决于具体需求的更多细节。
junky

-2

我建议您阅读这篇详细的文章。

https://blog.jondh.me.uk/2011/11/relational-database-versioning-strategies/comment-page-1/#comment-373850

另一种方法是在表中有一个version_id列和一个“当前”标志,该标志指定哪一行是当前行。每次需要更新时,都可以插入新行,并将现有版本的“当前”标志设置为0 / false,并将新添加的行设置为1。

这样,您可以创建仅显示那些设置了当前标志的视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.