【发布时间】:2014-04-22 11:06:23
【问题描述】:
我想为我的一个数据库实体构建一个类似 git 的版本控制系统。
模型将是:
Commit
parent_commit_id
Change
entity_id
commit_id
modifier (added, deleted, modified)
Entity
实体永远不会被真正删除,因此用户可以撤消提交并最终获得有效状态。
听起来很简单,但是:
- 用户每次点击都会生成一个提交(性能非常重要)
- 每次提交都会有大约 100 处更改(修改、添加或删除)
因为我们只是存储更改,所以必须计算或存储当前状态。
选项 1:保存每次提交的完整状态意味着我不仅会在提交中存储修改、添加和删除,而且还会存储所有未更改的实体。我认为这不是一个真正的选择,因为系统运行时将有超过 2000 万个实体。
选项 2:使用递归公用表表达式计算当前状态。我不知道这是否足够快......
选项 3:在一段时间后执行清理(如 git gc)。这意味着我实际上会删除在清理时不再有效的所有实体。这不是一个真正的选择,因为我希望能够查看所有更改并返回到这些更改。
选项 4:使用图形数据库 (neo4j)?它能以合理的性能处理这样的规范吗?
您还有其他想法吗?
【问题讨论】:
-
我想存储两个东西 - 一个具有当前状态的
unlogged表,以及一个包含一系列更改和原始状态的普通表。在崩溃时,您可以通过应用历史差异来重新生成未记录的“当前状态”表,但这需要一段时间。 (根据一致性要求,您甚至可以选择使用 redis / memcached 之类的东西来存储当前状态。但是您需要以某种方式对其进行缓存。)
标签: postgresql neo4j