是否存在可以进行版本控制的并发访问数据存储格式?

mtm*_*ald 5 database version-control version datastore

我有一个项目需要对数据存储进行版本控制(例如在 git 或 svn 中)。明确地说,我的意思是数据存储内容的版本控制,而不是模式。例如,我们将拍摄数据本身的快照,以便能够恢复到以前的状态。还需要分支和合并。

基本要求是:

  • 每个数据存储都可以驻留在自己的目录(存储库)中
  • 可以合并不同版本的数据内容(手动或使用工具)
  • 能够运行基本的选择查询来制作可视化报告

理想情况下:

  • 并发访问安全
  • 某种程度的关系完整性

我看过各种选择。SQLite(二进制格式)很难合并。CouchDB 有很大的合并可能性(多主复制),但不允许每个数据存储有不同的目录。纯 JSON 或其他文本文件使查询和关系变得困难。

有没有可以通过这种方式进行版本控制的数据存储格式?你会如何解决这个问题?

编辑(更多上下文):具体用例是实现分布式软件问题跟踪,类似于Fossil SCM 的风格。但是,虽然我对解决此问题的现有工具感兴趣,但我对探索和理解可用于构建此类工具的不同数据存储选项特别感兴趣。

Jul*_*ian 3

正如@RaydelMiranda 已经说明的那样,您的基本要求很容易满足。为了完整起见,JSON 也存在(大多数是新的)查询语言实现:

您可以将数据存储在 JSON 中,使用您选择的 DVCS 管理 JSON 文件,并使用上述语言之一来查询数据。您还可以将基本关系信息添加到任何格式,只需提供记录 ID 并引用其他记录中的这些 ID。

据我所知,没有任何工具可以同时满足任何一个“理想”要求(@LazyBadger 提到的 Liquibase 看起来很有趣,但它并不对数据库本身进行版本控制)。然而,您自己使用锁来添加对数据文件的并发访问的安全性是相当容易的。请注意,如果您使用库存 (D)VCS,则并发使用版本控制已经是安全的开箱即用。

关系完整性是最难解决的问题,特别是如果您坚持“创建数据库文件并将其粘贴到版本控制系统中”的范例。几乎肯定需要您做一些困难和 hacky 的事情,例如扩展现有的 XML/JSON 查询系统以保持记录排序并将内存中的查找表保留到原始文件位置(这对于保持可接受的速度是必要的) ),或修改 SQLite 以使用带有换行符的纯文本文件格式。

您还可以彻底改变范例:在 SQLite 等 RDBMS 中实现版本控制。这主要是定义“父版本”关系并且从不删除或更新记录,仅插入新版本的问题。要同步数据库的不同副本之间的更改,只需交换自上次同步以来所有新插入的记录,父关系将处理其余部分(模数一些复杂性以防止主键冲突)。这也是像 Git 这样的现有 DVCS 的做法。作为额外的好处,SQLite 和其他 RDBMS 已经可以安全地同时访问。