Javascript 如何实现git-like;“分支”;在Node.js中的MongoDB数据库上

Javascript 如何实现git-like;“分支”;在Node.js中的MongoDB数据库上,javascript,json,mongodb,git,diff,Javascript,Json,Mongodb,Git,Diff,我还有一个相关的问题(),但我也想知道如何更普遍地实现这个系统 基本上,我正在考虑创建一个“数据编辑器”应用程序,在这里我构建了一系列不同类型的表单,在一个通用的MongoDB文档中构建各种嵌套JSON(带有数组字段、嵌套数组字段等)。假设我最终在这个MongoDB集合中拥有100万个深度嵌套的JSON文档(或者很多集合,我还没有决定)。也就是说,有1000人同时编辑这些JSON字段(“路径”我会称之为路径,用于到达JSON文档中的深度嵌套值)。高层次的问题是我如何使它像Git一样工作 更具体地

我还有一个相关的问题(),但我也想知道如何更普遍地实现这个系统

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

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

你到底是如何开始设计这个的

  • 从理论上讲,您将如何实现完整的MongoDB数据库“分支”从字面上“克隆”数据库和每条记录是不现实的,因为数据库可能有几GB,而且太大,无法高效(从时间和金钱角度)克隆。这种系统中的分支实际上是什么样子的
我之所以感到困惑,主要是因为假设您有两个人在数据库的同一区域工作(相同的文档)。假设他们已经点击了“创建分支”,它没有对数据库做任何实际操作,但它将创建一个“差异容器”来保存他们用数据创建的差异,而不实际修改原始文档(直到PR得到批准)。这意味着为了获取他们的数据视图,我需要获取原始文档,加上它们的差异,然后合并它们。我想还不错。这就是需要发生的一切吗?还是我遗漏了什么


问题是,人称2的PR在人1的中间得到批准,编辑相似的数据。他们的视图现在将被更改,因为主数据库将使用他们没有执行的新数据进行更新。我如何防止这种情况您将如何真正地分支数据库?

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

时间:

有效期:

         [------------)
         [------------------------------------->
持续有效期:

         [------------)
         [------------------------------------->
已创建文档A,且最新版本无限期有效:

         [------------------------------------->
文件A分叉:

         [------------------------------------->
User A Fork:            |---------------------->
Doc A再次分叉:

         [------------------------------------->
User A Fork:            |---------------------->
User B Fork:                   |--------------->
用户A合并分叉:

         [----------------------------)[------->
User A Fork:            |-------------^
User B Fork:                   |--------------->
用户B拥有上一有效期的单据a副本。根据您希望应用程序的行为方式,只要有活动的fork,就可以保留旧版本的文档。根据历史记录要求,您可以删除任何有效期未持续且没有活动分支的文档。特别是关于有效状态的第2章和第5章


我从未使用过它,但也许可以查看源代码以获取更多想法。

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