mysql数据版本控制系统的最佳实践

mysql数据版本控制系统的最佳实践,mysql,database,versioning,Mysql,Database,Versioning,我必须将像文章这样的数据存储到mysql数据库中,如果文章被修改,我还必须保存旧版本,以便能够恢复它。我在这个主题上发现了一些类似的问题和帖子,但我不确定哪种解决方案是最好的 以下是“文章”的基本表格,以便更好地理解: 文章(id、名称、文本) 对我来说,有两种不同的方法: 方法1 将数据和文章的每个版本存储在表“articles”中,并添加列“version”和“status”。在版本i中,存储文章的递增版本号。活动文章获得“状态”1,其他文章获得“状态”2 专业版: 只需要一张桌子 新版本

我必须将像文章这样的数据存储到mysql数据库中,如果文章被修改,我还必须保存旧版本,以便能够恢复它。我在这个主题上发现了一些类似的问题和帖子,但我不确定哪种解决方案是最好的

以下是“文章”的基本表格,以便更好地理解:

文章(id、名称、文本)

对我来说,有两种不同的方法:

方法1 将数据和文章的每个版本存储在表“articles”中,并添加列“version”和“status”。在版本i中,存储文章的递增版本号。活动文章获得“状态”1,其他文章获得“状态”2

专业版:

  • 只需要一张桌子

  • 新版本是新数据的插入,只是旧版本的“状态”列的更新

Con's

  • 非常大的表(可能是较慢的查询??)
方法2 将字段“version”添加到“articles”中,并仅将活动数据存储到表“articles”中。旧版本的数据存储/移动到新表“articles\u versioned”

专业版:

  • 表“articles”中只有实际有效数据
Con's

  • 表的重复应用

所以。我忘了一个好主意了吗?如何处理其他表中的相关数据(如图像等)

我的选择是方法2的变体。粗体表示主键中的字段

  • 将每篇文章插入表
    文章\u版本
    id时间戳,名称,文本)
  • 第二个表是
    articles
    id,timestamp,[name,text])。注意时间戳不是主要的;可以复制名称和文本,也可以使用带有
    articles\u versioned
    的联接(这将很快,因为id和时间戳是
    articles\u versioned
    主键)
  • articles\u versioned
    在insert上有一个触发器,它获取刚刚插入的行并在
    articles上复制它
  • 要还原文章的特定版本,请修改
    articles
这种方法的优点是:

  • 您可以免费获得表格中的其他信息(文章的日期和时间),您可能需要这些信息
  • 您无需查询数据库即可获取当前日期。如果您使用版本,则必须
  • 您的代码不必在两个表中插入文章。您只需插入
    文章_version
    并从
    文章
    中读取,db就会在您通过触发器插入数据时负责迁移数据,从而避免任何一致性问题
  • 犯人

  • 在高度并发的环境中,可能同时插入两个版本,因此其中一个版本可能会失败。在插入用户编写的文章时,这不应该是一个问题(考虑到现在时间戳的精确性,这不太可能)。如果在
    INSERT
    语句中没有指定时间戳,而是将datetime字段设置为当前时间作为默认值,则可以完全避免此问题

  • 回答你剩下的问题。只要在状态上添加索引,方法1就不会导致更长的查询。只有当每篇文章都有很多不同的版本时,这才有意义;只要你平均每篇文章有2个版本或更少,索引只会让你慢下来,而且方法2也不会明显快一些(尽管我仍然推荐我的方法,因为它简化了代码,因为恢复一个版本不需要切换两行的状态)


    相关资源(如图像)应遵循类似的版本控制。我假设您正在将它们保存在文件系统上;使用一个表(id,image\u name)为每个图像指定一个id,然后将图像另存为
    -id-.jpg
    ,而不是用它们的真实名称保存它们。image_name字段将使您能够知道原始文件名是什么(如果您关心的话)。通过这种方式,您可以像对文章进行版本设置一样对图像进行版本设置,并且在文章中您可以使用类似于
    的内容,您知道这些内容将永远可用。

    这通常称为“更改数据捕获”(CDC)。Google for it:你甚至不需要更新以前的状态,只需为那篇文章选择最高的id。状态是如果我想回到以前的版本。尝试折衷这两个是:相关的:抱歉,这个答案来得有点晚,但可能对其他人有用。去考古宫?来吧,我在寻找其他问题时遇到了这个问题,在注意到问题日期之前,我开始回答:)。我认为这仍然是相关的。