mysql数据版本控制系统的最佳实践
我必须将像文章这样的数据存储到mysql数据库中,如果文章被修改,我还必须保存旧版本,以便能够恢复它。我在这个主题上发现了一些类似的问题和帖子,但我不确定哪种解决方案是最好的 以下是“文章”的基本表格,以便更好地理解: 文章(id、名称、文本) 对我来说,有两种不同的方法: 方法1 将数据和文章的每个版本存储在表“articles”中,并添加列“version”和“status”。在版本i中,存储文章的递增版本号。活动文章获得“状态”1,其他文章获得“状态”2 专业版:mysql数据版本控制系统的最佳实践,mysql,database,versioning,Mysql,Database,Versioning,我必须将像文章这样的数据存储到mysql数据库中,如果文章被修改,我还必须保存旧版本,以便能够恢复它。我在这个主题上发现了一些类似的问题和帖子,但我不确定哪种解决方案是最好的 以下是“文章”的基本表格,以便更好地理解: 文章(id、名称、文本) 对我来说,有两种不同的方法: 方法1 将数据和文章的每个版本存储在表“articles”中,并添加列“version”和“status”。在版本i中,存储文章的递增版本号。活动文章获得“状态”1,其他文章获得“状态”2 专业版: 只需要一张桌子 新版本
- 只需要一张桌子
- 新版本是新数据的插入,只是旧版本的“状态”列的更新
- 非常大的表(可能是较慢的查询??)
- 表“articles”中只有实际有效数据
- 表的重复应用
所以。我忘了一个好主意了吗?如何处理其他表中的相关数据(如图像等) 我的选择是方法2的变体。粗体表示主键中的字段
- 将每篇文章插入表
文章\u版本
(id,时间戳,名称,文本)
- 第二个表是
(id,timestamp,[name,text])。注意时间戳不是主要的;可以复制名称和文本,也可以使用带有articles
的联接(这将很快,因为id和时间戳是articles\u versioned
主键)articles\u versioned
在insert上有一个触发器,它获取刚刚插入的行并在articles\u versioned
articles上复制它
- 要还原文章的特定版本,请修改
表articles
文章_version
并从文章
中读取,db就会在您通过触发器插入数据时负责迁移数据,从而避免任何一致性问题INSERT
语句中没有指定时间戳,而是将datetime字段设置为当前时间作为默认值,则可以完全避免此问题回答你剩下的问题。只要在状态上添加索引,方法1就不会导致更长的查询。只有当每篇文章都有很多不同的版本时,这才有意义;只要你平均每篇文章有2个版本或更少,索引只会让你慢下来,而且方法2也不会明显快一些(尽管我仍然推荐我的方法,因为它简化了代码,因为恢复一个版本不需要切换两行的状态)
相关资源(如图像)应遵循类似的版本控制。我假设您正在将它们保存在文件系统上;使用一个表(id,image\u name)为每个图像指定一个id,然后将图像另存为
-id-.jpg
,而不是用它们的真实名称保存它们。image_name字段将使您能够知道原始文件名是什么(如果您关心的话)。通过这种方式,您可以像对文章进行版本设置一样对图像进行版本设置,并且在文章中您可以使用类似于
的内容,您知道这些内容将永远可用。这通常称为“更改数据捕获”(CDC)。Google for it:你甚至不需要更新以前的状态,只需为那篇文章选择最高的id。状态是如果我想回到以前的版本。尝试折衷这两个是:相关的:抱歉,这个答案来得有点晚,但可能对其他人有用。去考古宫?来吧,我在寻找其他问题时遇到了这个问题,在注意到问题日期之前,我开始回答:)。我认为这仍然是相关的。