Postgresql 存储类似git的更改提交历史
我想为我的一个数据库实体构建一个类似git的版本控制系统 这些模式将是:Postgresql 存储类似git的更改提交历史,postgresql,neo4j,Postgresql,Neo4j,我想为我的一个数据库实体构建一个类似git的版本控制系统 这些模式将是: Commit parent_commit_id Change entity_id commit_id modifier (added, deleted, modified) Entity 实体永远不会被真正删除,因此用户可以撤消提交并以有效状态结束 听起来很简单,但是: 用户每次单击都会生成提交(性能非常重要) 每次提交时,将有大约100个更改(修改、添加或删除) 因为我们只是存储更改,所以必须计
Commit
parent_commit_id
Change
entity_id
commit_id
modifier (added, deleted, modified)
Entity
实体永远不会被真正删除,因此用户可以撤消提交并以有效状态结束
听起来很简单,但是:
- 用户每次单击都会生成提交(性能非常重要)
- 每次提交时,将有大约100个更改(修改、添加或删除)
你还有其他想法吗?我必须仔细考虑一些细节-但是如果你从视频处理中吸取了教训-有原始签入,每个版本都有增量,但有一个“keyframe”属性,它将指示完整的快照,每次,比如说10次提交,并且始终是最新版本。给你一个好的性能组合,不存储每次提交的完整数据…我必须仔细考虑一些细节-但是如果你从视频处理中吸取教训-有原始签入,每个版本都有增量,但有一个“keyframe”属性,表示完整的快照,比如说10次提交,而且总是最新的版本。为您提供良好的性能组合,不存储每次提交的完整数据…您使用Neo4j的想法很有趣。快速阅读已经显示出git的复杂性水平,以及提交的拓扑是一个“有向无环图”这一事实,这说明Neo4j是有利于的 但是有一件事要考虑的是你计划的模型有多复杂?您想要git的部分或全部复杂性吗?如果是这样,像Neo4j这样灵活的数据库将是一个好主意
如果您只希望跟踪单个文件的更改,而不必考虑多个并发用户,那么请考虑存储最新文件的旧RCS系统,再加上以前修改的一系列差异。这可以很容易地存储在两个表中(一个用于文件,一个用于更改)。这与Dan的答案相反,Dan的答案存储了第一个文件以及从那里所做的更改。这两种方法都可以工作,但是RCS方法能够比旧版本更快地检索最近的版本,而视频方法检索旧版本的速度最快。因为你从最旧的到最新的观看视频,他们这样做是有道理的,但我认为对于文件修订,你通常首先要看最新的。要更全面地回顾这些方法,请查看Martin Fowlers的博客。然而,这些方法并没有真正考虑多个并发用户,或者任何复杂的用户。但它们可能是更多的基础。
因此,让我们重新考虑更复杂的模型。Neo4j是无模式的,允许您从简单开始,并根据需要增强功能。例如,您可以遵循以下路线:- 构建一个简单的类似于RCS的文件修订系统,在单个图形节点中包含最新的内容,以及一系列到旧版本的链接(或到旧版本的差异链)
- 然后决定需要支持多个文件的提交,添加树对象(如中所述),这些树对象可以是图形中的真实树结构,图形节点链接到文件对象节点
- 这些树由提交对象引用,提交对象本身与以前的提交链接在链中。一旦有了这些提交链,您可能不再需要文件链,因为您将遍历提交链。每次提交都指向一棵树,该树指向文件
- 然后,也许您决定支持分支,因此您添加了标记和分支对象,这些对象链接到提交(以及从提交到提交的树和文件)。这自然会导致无环有向图,显示随时间发生的分支和合并 <> LI>也许你还考虑添加ReFug,它也可以被建模为一个图。
那么如何开始呢?举个例子,看看下面的一些例子。一个简单的,在这里似乎相关的是。然后在此基础上进行构建。您使用Neo4j的想法很有趣。快速阅读已经显示出git的复杂性水平,以及提交的拓扑是一个“有向无环图”这一事实,这说明Neo4j是有利于的 但是有一件事要考虑的是你计划的模型有多复杂?您想要git的部分或全部复杂性吗?如果是这样,像Neo4j这样灵活的数据库将是一个好主意 如果你只想要一些