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

时间:2013-07-29 13:31:08

标签: mysql database versioning

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

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

文章(身份证,姓名,文字)

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

方法1

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

Pro的:

  • 只需要一张表

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

精读的

  • 非常大的表(可能是较慢的查询???)

方法2

将字段“version”添加到“articles”并仅将活动数据存储到表“articles”中。旧版本的数据被存储/移动到新表“articles_versioned”。

Pro的:

  • 表格“articles”
  • 中只有实际有效数据

精读的

  • 出版表格

因此。我忘记了一个好的方法吗?如何处理其他表格中的相关数据(如图像等)?

1 个答案:

答案 0 :(得分:7)

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

  • 您在表articles_versioned中插入每篇文章( ID 时间戳,名称,文字)
  • 您的第二个表格为articles ID ,时间戳,[名称,文字])。注意时间戳不是主要的;可以复制名称和文本,也可以使用articles_versioned的联接(由于id和时间戳是articles_versioned主键,因此会很快)
  • articles_versioned在insert上有一个触发器,它接受刚刚插入的行并在articles
  • 上复制它
  • 要恢复文章的特定版本,请修改articles表。

这种方法的优点是:

  1. 您可以免费获得表格中您可能需要的其他信息(文章的日期和时间)
  2. 您无需查询数据库即可获取当前日期。如果您使用的是版本,则必须使用。
  3. 您的代码不必将文章插入两个表中。您只需在articles_versioned中插入并从articles读取,db就会在您通过触发器插入数据时进行迁移,从而避免出现任何一致性问题。
  4. 精读的

    1. 在高度并发的环境中,可能同时插入两个版本,因此其中一个版本可能会失败。插入用户编写的文章时,这不应该是一个问题(这些天给定时间戳的精度极不可能)。如果您未在INSERT语句中指定时间戳,而是将datetime字段设置为将当前时间作为默认值,则可以完全避免此问题。
    2. 回答你的其余问题。只要在状态上添加索引,方法1就不会导致更长的查询。只有当你每篇文章都有不同的版本时才有意义;只要你平均每篇文章有2个版本或更少,索引只会降低你的速度,而且方法2无论如何都不会明显更快(尽管我仍然推荐我的方法,因为它简单地代码,因为恢复版本确实如此不需要两行的切换状态。)

      相关资源(如图像)应遵循类似的版本控制。我假设你将它们保存在文件系统上;而不是使用真实姓名保存它们,使用表格( id ,image_name)为每个图像提供一个ID,然后将图像保存为-id-.jpg。 image_name字段将使您能够知道原始文件名是什么(如果您关心它)。通过这种方式,您可以使用与版本文章相同的方式对图像进行版本设置,在文章中使用<img src="-id-.jpg">之类的文章,您知道它们将永远可用。

相关问题