有哪些标准/推荐的方法来存储经过版本控制的数据库数据?

11

我想将一篇博客文章存储到数据库中。我认为如果能够像版本控制文本文件一样,对该数据进行不同版本的管理会很好。

因此,我设想它的工作方式就像一个带有版本控制的表中的一行。例如,您可以检索该行的最新版本或以前的版本。您甚至可以从该行创建分支。

这种解决方案是否存在?

可能有用的信息: 我目前正在使用Python、Django和MySQL。我正在尝试使用MongoDB。

为了更清晰/提供更多背景信息: 我正在寻找更适合对行进行“版本控制”的解决方案,而不是针对整个数据库进行版本控制的解决方案。例如,我将能够在不切换数据库的情况下查询2011年1月1日和2010年1月1日的博客文章内容。


你是否考虑过使用像 Git 这样的版本控制系统?看到这种解决方案的优缺点会很有趣。 - milan
@milan - 自从什么时候Git版本控制系统开始管理数据库记录 - N.B.
问题并没有说“任何”数据库记录,而是博客文章,这些文章大多是文本,所以为什么不呢? - milan
1
这个回答解决了你的问题吗?如何在数据库中进行版本控制记录 - Marco Eckstein
2个回答

6

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

在我的工作中,我需要保存各种用户输入的版本。我所采取的方式是:

我有一个master表和一个revisions表。我选择这两个名称仅为例子而已。

master表存储以下信息:

  • id (自增)
  • version_id (int)

revisions表存储以下信息:

  • id
  • master_id
  • version_id
  • 与输入实体相关的其余数据(日期等)

通过这种方式,我获得了一个ID,例如一个博客文章。如果有人编辑帖子,我将把那些信息存储到revisions表中。通过触发器,我会递增revisions表中的version_id。之后,我会使用最新的version_id号更新master表。这样,当我想要查看最新版本时,就不必执行MAX()了。

这样,我获得了一个简单但强大的网站内容版本系统。更改很容易看到,如果你滥用一些MySQL酷功能,获取数据也非常快(在我的实际表中,我最大限度地滥用InnoDB的聚簇主键。因此,数据库设计与我在这里发布的略有不同)。


你能提供关于主版本和修订版本之间关系的信息吗? - bekanur98
不必每次更新“master.version_id”列,您可以查询连接2个表,其中“revisions.master_id”=“master.id”,并使用DISTINCT ON“revisions.master_id”和ORDER BY“revisions.created_at”列(将其添加到“revisions”中)。 - Kernel James
@KernelJames 只因为你可以使用较慢的方法,不代表你应该这样做。 - N.B.

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..."
}

所以这里的想法是分别存储每个版本以及指向当前公共版本和编辑、博客作者等的当前版本的指针。
我的答案有点偏向 MongoDB(因为我为家用构建了一个基于 MongoDB 的博客引擎),但是对于任何存储系统都应该类似。
优点:
  • 不需要针对公共或私有文章执行版本号的 MAX 查询
  • 不将“最后编辑”与版本号相关联,这可能并不理想
  • 即使已发布某个版本,也可以进行版本控制
  • 可以获取摘要而无需获取整篇文章
缺点:
  • 每次都会复制整个文本。对于文本数据来说这不是一个真正的问题(试着输入 1GB ...)但对于更大的博客网站来说可能会成为问题。缓解方法:使用 deflate 压缩文本、增量压缩。
  • 需要更新两个对象

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接