2013-07-29 61 views
6

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

这里是为了更好地理解基本表 “文章”:

文章(ID,姓名,文本)

对于我来说,这是你的两种不同的方法:

方法1

将数据和文章的每个版本存储在表格“文章”中,并添加“版本”和“状态”列。在版本中,我存储文章的增加版本号。主动文章获得了“状态” 1和其他人的“身份” 2.

Pro的:

  • 只需要一个表

  • 新版本的插件新的数据,只有老的“状态” -column的更新

反对的

  • 非常大的表(也许慢查询???)

方法2

,添加字段“版本”,以“公司章程”,并仅在活动数据存储到表“文章”。旧版本的数据存储/移动到新表“articles_versioned”。

Pro的:

  • 只有实际有效数据表中的 “文章”

反对的表

  • Dublication

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

+1

这通常称为“更改数据捕获”(CDC)。谷歌为它:http://www.google.com/search?aq = f&gcx = w&sourceid = chrome&ie = UTF-8&q = mysql + change + data + capture&safe = active – duffymo

+0

你甚至不需要更新以前的状态,只需选择该特定文章的最高ID – Anigel

+0

状态是如果我想回到以前的版本 – bernhardh

回答

3

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

  • 您在表articles_versionedID时间戳,名称,文本)
  • 你的第二个表是articles插入每篇文章(ID,时间戳,[名字,文字])。请注意时间戳不是主要的;命名和文本可以被复制,或者您可以使用与articles_versioned连接(这将是快速的,因为ID和时间戳是articles_versioned主键)
  • articles_versioned对插入的触发器,是以刚插入的行并复制它articles
  • 要恢复文章的特定版本,请修改articles表。

这种方法的优点是:

  1. 您免费获得您的表中的另一信息(文章的日期和时间),你可能需要无论如何
  2. 你不需要查询数据库以获取当前日期。如果你使用版本,你必须。
  3. 您的代码不必将文章插入两个表格中。您只需插入articles_versioned并从articles中读取,db在您通过触发器插入数据时负责迁移数据,避免了任何一致性问题。

反对的

  1. 在大量并发环境中,两个版本可以在同样的时间插入,所以他们中的一个可能会失败。插入用户编写的文章时,这应该不成问题(这些日期时间戳的精度极不可能)。如果您没有在INSERT声明中指定时间戳记,而是将日期时间字段设置为将当前时间作为默认值,则可以完全避免此问题。

要回答你的问题的其余部分。只要您添加状态索引,方法1不会导致更长的查询。这只有在你倾向于每篇文章有许多不同版本时才有意义;只要你平均每篇文章有两个版本或者更少,索引只会让你放慢速度,而方法2无论如何都不会明显更快(尽管我仍然推荐我的方法,因为它简单地编写代码,因为恢复版本确实不需要两行的切换状态)。

相关资源,如图片,应遵循相似的版本。我假设你将它们保存在文件系统上;不要用真实姓名保存它们,请使用表格(ID,image_name)为每个图像分配一个ID,然后将图像保存为-id-.jpg。 image_name字段将使您能够知道原始文件名是什么(如果你关心的话)。这样,您可以使用与版本文章相同的方式版本化图像,并且在文章中您可以使用类似<img src="-id-.jpg">的内容,您知道这些内容将永远保持可用状态。

+0

对不起,这个答案有点晚,但可能对其他人有用。 – p91paul

+0

去考古学锣? – Strawberry

+1

来吧,我在寻找别的东西的时候遇到了这个问题,并且在注意到问题日期之前我开始回答:)。我认为它仍然可以是相关的。 – p91paul