存储版本控制的数据库数据的标准/推荐方法是什么?

时间:2011-12-15 15:49:04

标签: mysql mongodb postgresql version-control database

我想将博客文章存储在数据库中。我认为拥有不同版本的数据会很不错,就像版本控制对文本文件一样。

所以,我想它就像一个表中的一行,它有版本控制。因此,例如,您可以检索该行的最新版本或先前版本。你甚至可以从那一行开始分支。

这样的事情是否存在?

可能有用的信息: 我目前正在使用Python,Django& MySQL的。我正在试验MongoDB

编辑以获得清晰度/更多背景信息: 我正在寻找一种更适合行的“版本控制”而不是数据库的解决方案;我对分支整个数据库并不感兴趣。例如,我将能够在2011年1月1日和2010年1月1日查询博客文章的内容(无需切换数据库)。

3 个答案:

答案 0 :(得分:4)

版本控制是一个复杂的主题;正确行事真的很有挑战性,这本质上就是为什么即使使用,例如git可能很难。我不想写一个完整的版本控制系统。

对于更简单的要求,请考虑此结构,在伪mongodb / JSON中:

BlogPost {
    "_id": ObjectId("..."),
    "slug" : "how-to-version-my-posts",
    "author" : "cammil",
    "published" : date,
    "lastModified" : date,
    "publicVersion" : 32,
    "draftVersion" : 34,
    "teaserText" : "lorem ipsum dolor sit amet..."
}

BlogPostBody {
    "_id" : ObjectId("..."),
    "Version" : 32,
    "Text" : "lorem ipsum dolor sit amet..."
}

所以这里的想法是分别存储每个版本和指向当前公共版本的指针以及编辑,博客等的当前版本。

我的回答是以MongoDB为中心(因为我为家庭使用构建了一个基于MongoDB的博客引擎),但它应该适用于任何存储系统。

优点:

  • 无需对公开或私人帖子的版本号进行MAX次查询
  • 不会将last edited与版本号相关联,这可能是不可取的
  • 即使已发布某个版本,也允许进行版本控制
  • 无需提取整篇文章即可获取预告片

缺点:

  • 每次复制整个文本。我猜不是真正关心文本数据(尝试输入1GB ......)。但是,对于更大的博客网站来说,这将是一个问题。缓解:使用deflate,delta-compression压缩文本。
  • 需要在更新时更新两个对象

答案 1 :(得分:2)

OffScale DataGrove允许您对整个数据库进行版本化。

它跟踪发生在数据库中的所有更改,您可以标记版本并在它们之间来回切换。 DataGrove的独特之处在于它可以对整个数据库模式和数据进行版本化。

在您的示例中 - 只需将您想要的行/数据添加到数据库并标记版本。你将永远能够回到那个版本甚至从它分支。

答案 2 :(得分:2)

首先,我必须说这是一个有趣的问题。

在我的工作中,我要保存各种用户输入的版本。我这样做的方式,无论如何我都不知道这是不是正确的方法,如下:

我有一个master表和revisions表。我只选择这两个名字作为例子。

主人做的是存储以下信息:

  • id(autoincrement)
  • version_id(int)

revisions商店的内容如下:

  • id
  • master_id
  • version_id
  • 有关所输入实体的其他相关数据(日期等)

我通过这种方式获得的是我得到了一个ID,让我们说一篇博文。如果有人编辑帖子,我会将该信息存储到revisions表。通过触发器,我正在递增version_id表中的revisions。之后,我使用最新的master号码更新version_id表。这样,当我想看看最新版本是什么时,我不必执行MAX()

通过这种方式,我获得了简单而强大的网站内容版本系统。很容易看到变化,如果你滥用了一些MySQL的酷炫功能,那么获取数据的速度也非常快(在我的实际表格中,我正在滥用InnoDB的集群主键,因此数据库设计略有差异。我在这里发布了。)