【发布时间】: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