Postgresql 存储类似git的更改提交历史

Postgresql 存储类似git的更改提交历史,postgresql,neo4j,Postgresql,Neo4j,我想为我的一个数据库实体构建一个类似git的版本控制系统 这些模式将是: Commit parent_commit_id Change entity_id commit_id modifier (added, deleted, modified) Entity 实体永远不会被真正删除,因此用户可以撤消提交并以有效状态结束 听起来很简单,但是: 用户每次单击都会生成提交(性能非常重要) 每次提交时,将有大约100个更改(修改、添加或删除) 因为我们只是存储更改,所以必须计

我想为我的一个数据库实体构建一个类似git的版本控制系统

这些模式将是:

Commit
  parent_commit_id

Change
  entity_id
  commit_id
  modifier (added, deleted, modified)

Entity
实体永远不会被真正删除,因此用户可以撤消提交并以有效状态结束

听起来很简单,但是:

  • 用户每次单击都会生成提交(性能非常重要)
  • 每次提交时,将有大约100个更改(修改、添加或删除)
因为我们只是存储更改,所以必须计算或存储当前状态

选项1:保存每个提交的完整状态意味着我不仅要在提交中存储修改、添加和删除,还要存储每个未更改的实体。我认为这不是一个真正的选项,因为当系统运行时,将有超过2000万个实体

选项2:使用递归公共表表达式计算当前状态。我不知道这是否足够快

选项3:在一段时间后执行清理(如git gc)。这意味着我将实际删除在清理时不再有效的所有实体。这不是一个真正的选项,因为我希望能够看到所有更改并返回这些更改

选项4:使用图形数据库(neo4j)?它能以合理的表现处理这样的行为吗


你还有其他想法吗?

我必须仔细考虑一些细节-但是如果你从视频处理中吸取了教训-有原始签入,每个版本都有增量,但有一个“keyframe”属性,它将指示完整的快照,每次,比如说10次提交,并且始终是最新版本。给你一个好的性能组合,不存储每次提交的完整数据…

我必须仔细考虑一些细节-但是如果你从视频处理中吸取教训-有原始签入,每个版本都有增量,但有一个“keyframe”属性,表示完整的快照,比如说10次提交,而且总是最新的版本。为您提供良好的性能组合,不存储每次提交的完整数据…

您使用Neo4j的想法很有趣。快速阅读已经显示出git的复杂性水平,以及提交的拓扑是一个“有向无环图”这一事实,这说明Neo4j是有利于的

但是有一件事要考虑的是你计划的模型有多复杂?您想要git的部分或全部复杂性吗?如果是这样,像Neo4j这样灵活的数据库将是一个好主意

如果您只希望跟踪单个文件的更改,而不必考虑多个并发用户,那么请考虑存储最新文件的旧RCS系统,再加上以前修改的一系列差异。这可以很容易地存储在两个表中(一个用于文件,一个用于更改)。这与Dan的答案相反,Dan的答案存储了第一个文件以及从那里所做的更改。这两种方法都可以工作,但是RCS方法能够比旧版本更快地检索最近的版本,而视频方法检索旧版本的速度最快。因为你从最旧的到最新的观看视频,他们这样做是有道理的,但我认为对于文件修订,你通常首先要看最新的。要更全面地回顾这些方法,请查看Martin Fowlers的博客。然而,这些方法并没有真正考虑多个并发用户,或者任何复杂的用户。但它们可能是更多的基础。

因此,让我们重新考虑更复杂的模型。Neo4j是无模式的,允许您从简单开始,并根据需要增强功能。例如,您可以遵循以下路线:

  • 构建一个简单的类似于RCS的文件修订系统,在单个图形节点中包含最新的内容,以及一系列到旧版本的链接(或到旧版本的差异链)
  • 然后决定需要支持多个文件的提交,添加树对象(如中所述),这些树对象可以是图形中的真实树结构,图形节点链接到文件对象节点
  • 这些树由提交对象引用,提交对象本身与以前的提交链接在链中。一旦有了这些提交链,您可能不再需要文件链,因为您将遍历提交链。每次提交都指向一棵树,该树指向文件
  • 然后,也许您决定支持分支,因此您添加了标记和分支对象,这些对象链接到提交(以及从提交到提交的树和文件)。这自然会导致无环有向图,显示随时间发生的分支和合并
  • <> LI>也许你还考虑添加ReFug,它也可以被建模为一个图。
当您浏览上面的列表时,整个图变得更加丰富和复杂,支持更大的用例集。我认为这是构建数据模型的好方法

从阅读中可以清楚地看到,即使有了这里提供的简化描述,我们也可以看到大多数is a图的建模有很多价值。链表、树和非循环有向图。在我看来,Neo4j将是一种很好的技术


那么如何开始呢?举个例子,看看下面的一些例子。一个简单的,在这里似乎相关的是。然后在此基础上进行构建。

您使用Neo4j的想法很有趣。快速阅读已经显示出git的复杂性水平,以及提交的拓扑是一个“有向无环图”这一事实,这说明Neo4j是有利于的

但是有一件事要考虑的是你计划的模型有多复杂?您想要git的部分或全部复杂性吗?如果是这样,像Neo4j这样灵活的数据库将是一个好主意

如果你只想要一些