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

cam*_*mil 8 mysql database postgresql version-control mongodb

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

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

有这样的事吗?

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

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

mne*_*syn 5

版本控制是一个复杂的话题;做对了真的很有挑战性,这就是为什么即使使用例如 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..."
}
Run Code Online (Sandbox Code Playgroud)

所以这里的想法是单独存储每个版本,并为编辑、博主等提供指向当前公开版本和当前版本的指针。

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

好处:

  • 无需MAX查询公共或私人帖子的版本号
  • 不相关last edited,以版本号,这可能是不希望
  • 即使某个版本已经发布,也允许版本控制
  • 无需获取整篇文章即可获取预告片

缺点:

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


N.B*_*.B. 5

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

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

我有一张master桌子和revisions一张桌子。我选择这两个名称只是为了示例。

master 所做的是存储以下信息:

  • id(自动递增)
  • version_id (int)

revisions下面是什么店:

  • ID
  • master_id
  • 版本号
  • 关于输入实体的其余相关数据(日期等)

我通过这种方式取得的成果是我获得了一个 ID,比如说一篇博客文章。如果有人编辑了帖子,我会将这些信息存储到revisions表格中。通过触发器,我增加了version_idinrevisions表。之后,我master用最新的version_id数字更新表。这样我就不必MAX()在想查看最新版本时执行。

这样我就获得了简单而强大的网站内容版本系统。很容易看到变化,如果你滥用 MySQL 的一些很酷的特性,获取数据的速度也非常快(在我的实际表中,我最大限度地滥用了 InnoDB 的集群主键。所以 db 设计与那个略有不同。我在这里发帖)。