我的 2 便士值。有点渴望,但是……我的一个孵化项目也有类似的要求。与您的类似,我的关键要求是文档数据库(在我的情况下为 xml),带有文档版本控制。它适用于具有大量协作用例的多用户系统。我的偏好是使用支持大多数关键要求的可用开源解决方案。
切入正题,我找不到任何一款产品能够同时提供这两种功能,并且具有足够的可扩展性(用户数量、使用量、存储和计算资源)。我偏向于 git,因为它具有所有有前途的功能,并且(可能的)解决方案可以从中制作出来。当我更多地玩弄 git 选项时,从单一用户视角转变为多(毫)用户视角成为一个明显的挑战。不幸的是,我没有像您那样进行实质性的性能分析。(.. 懒惰/早点退出....对于第 2 版,口头禅)给你力量!无论如何,我有偏见的想法已经演变为下一个(仍然有偏见的)替代方案:在各自的领域、数据库和版本控制中最好的工具的网格组合。
虽然仍在进行中(......并且略微被忽视),但变形版本就是这样。
- 在前端:(面向用户)使用数据库进行第一级存储(与用户应用程序接口)
- 在后端,使用版本控制系统 (VCS)(如 git )对数据库中的数据对象执行版本控制
从本质上讲,这相当于向数据库添加一个版本控制插件,使用一些集成胶水,您可能需要开发它,但可能要容易得多。
它(应该)如何工作是主要的多用户界面数据交换是通过数据库进行的。DBMS 将处理所有有趣和复杂的问题,例如多用户、并发、原子操作等。在后端,VCS 将对一组数据对象执行版本控制(无并发或多用户问题)。对于数据库上的每个有效事务,版本控制仅对可能已有效更改的数据记录执行。
至于接口胶水,它将是数据库和VCS之间的简单互通函数的形式。在设计方面,简单的方法是事件驱动接口,来自数据库的数据更新触发版本控制程序(提示:假设 Mysql,使用触发器和 sys_exec() blah blah ...)。就实现的复杂性而言,它将从简单有效的(例如脚本)到复杂而精彩的(一些编程的连接器接口)。一切都取决于你想用它有多疯狂,以及你愿意花多少汗水资本。我认为简单的脚本应该可以发挥作用。为了访问最终结果,各种数据版本,一个简单的替代方法是使用 VCS 中版本标记/id/hash 引用的数据填充数据库的克隆(更多是数据库结构的克隆)。同样,这一位将是一个简单的接口查询/翻译/映射作业。
仍有一些挑战和未知数需要处理,但我认为其中大部分的影响和相关性将在很大程度上取决于您的应用程序需求和用例。有些可能最终成为非问题。一些问题包括 2 个关键模块(数据库和 VCS)之间的性能匹配,对于具有高频数据更新活动的应用程序,随着时间的推移在 git 端作为数据缩放资源(存储和处理能力),以及用户增长:稳定、指数或最终达到高原
在上面的鸡尾酒中,这是我目前正在酿造的
- 将 Git 用于 VCS(最初被认为是好的旧 CVS,因为在 2 个版本之间仅使用变更集或增量)
- 使用 mysql(由于我的数据高度结构化,xml 具有严格的 xml 模式)
- 玩弄 MongoDB(尝试使用 NoSQl 数据库,它与 git 中使用的本机数据库结构非常匹配)
一些有趣的事实 - git 实际上做了一些优化存储的事情,例如压缩,并且只存储对象修订之间的增量 - 是的,git 确实只存储数据对象修订之间的变更集或增量,它适用于哪里(它知道何时以及如何)。参考:packfiles,深入Git 内部
- 回顾 git 的对象存储(内容可寻址文件系统),显示了与 mongoDB 等 noSQL 数据库的惊人相似之处(从概念的角度来看)。同样,以牺牲汗水资本为代价,它可能会为集成 2 和性能调整提供更多有趣的可能性
如果您做到了这一点,请告诉我上述是否适用于您的情况,并假设适用,它将如何与您上次综合性能分析中的某些方面相匹配