【问题标题】:How to implement git-like "branching" on a MongoDB database in Node.js如何在 Node.js 中的 MongoDB 数据库上实现类似 git 的“分支”
【发布时间】:2020-11-01 18:38:48
【问题描述】:

我有另一个相关问题 (How to implement checking and ignoring when an array/object path is *moved* when diffing arrays in JavaScript?),但我也想知道如何更普遍地实施这个系统。

基本上我正在考虑创建一个“数据编辑器”应用程序,我在其中构建了一堆各种类型的表单,在一个通用的 MongoDB 文档中构建了各种嵌套的 JSON(带有数组字段、嵌套数组字段等) .假设我最终在这个 MongoDB 集合中拥有 100 万个深度嵌套的 JSON 文档(或者可能是很多集合,我还没有决定)。假设有 1000 人同时编辑这些 JSON 字段(我称之为“路径”,以达到 JSON 文档中深度嵌套的值)。高层次的问题是我如何让这个工作像 Git 一样?

更具体地说,我在脑海中想象的问题可以通过对数据进行分支和创建“拉取请求”来解决。通过这种方式,人们基本上可以创建整个数据库的新分支(例如创建整个 repo 的 git 分支),然后编辑他们想要的任何内容。然后使用我也试图弄清楚的差异算法(上面链接),我们可以简单地基于“初始分支状态”和“最终分支状态”创建一个差异。然后,PR 将包含 JSON“路径”列表及其对应值,然后可以批准并“合并”到“主”MongoDB 数据库中。

您究竟会如何开始构建这个?

  • 理论上你将如何实现一个完整的 MongoDB 数据库“分支”? 从字面上“克隆”数据库和每条记录是不现实的,因为数据库可能有几个 GB 并且太大而无法有效(时间方面和金钱方面)克隆。这种系统中的分支实际上会是什么样子?

我感到困惑的原因主要是因为假设您有 2 个人在数据库的同一区域(相同的文档)上工作。假设他们已经点击了“创建分支”,它并没有对数据库做任何事情,但它会创建一个“差异容器”来保存他们使用数据创建的差异,而不实际修改原始文档(直到 PR 获得批准)。这意味着为了获取 他们的 数据视图,我需要获取原始文档以及它们的差异,然后合并它们。我猜还不错。这就是所有需要发生的事情吗?还是我错过了什么?

问题是,假设第 2 个人的 PR 在第 1 个人编辑相似数据的过程中获得批准。他们的视图现在将被更改,因为主数据库更新了他们没有做的新数据。我该如何防止这种情况? 您将如何真正地对数据库进行分支

【问题讨论】:

  • 您不会分支数据库。你会像 git 等一样创建一个合适的磁盘数据存储系统。

标签: javascript json mongodb git diff


【解决方案1】:

我认为您正在潜入时间数据的世界,因此开始绘制时间线可能会有很大帮助。

时间:

----------------------------------------------->

有效期:

         [------------)

持续有效期:

         [------------------------------------->

已创建文档 A,最新版本无限期有效:

         [------------------------------------->

Doc A 分叉:

         [------------------------------------->
User A Fork:            |---------------------->

Doc A 再次分叉:

         [------------------------------------->
User A Fork:            |---------------------->
User B Fork:                   |--------------->

用户A合并fork:

         [----------------------------)[------->
User A Fork:            |-------------^
User B Fork:                   |--------------->

用户 B 拥有上一有效期的文档 A 的副本。根据您希望应用程序的行为方式,只要存在活动的分叉,您就可以保留旧版本的文档。根据历史记录的要求,您可以删除任何有效期未持续且没有活动分叉的文档。 Here's a nice book about temporal sql databases that might interest you. 特别是关于有效状态的第 2 章和第 5 章。

我从未使用过它,但也许可以查看Irmin 的来源以获得更多想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多