我正在寻找关于设计围绕版本化数据的数据模型的最佳方式的一些输入。将存在一对多和多对多关系,这些关系可以在不同版本之间发生变化。
我正在寻找一些不同的策略,最终目标是进行有效的比较,如果可能的话,只存储delta。
答案 0 :(得分:14)
这实际上是一个相当困难的问题。
版本控制对象很简单。它们之间的版本连接不是那么多 - 你必须做出一些设计决定。例如:
最重要的是,大多数“支持”表格可能也需要“版本感知”。
如果我是你,我可能会从以下起点开始:
OBJECT和CONNECTION之间的符号是"category"(又称继承,子类,泛化层次等)。
这种设计背后的基本思想是支持“快照”,“恢复”和“增量”功能:
查询将会是这样的:
假设您必须放置对象A,B和C,其中A是B和C的父对象:
generation: 0
A0
/ \
B0 C0
添加新对象D:
generation: 0 1
A0
/ | \
B0 C0 D1
修改A和C并删除B:
generation: 0 1 2
A0
A2
/ | \
B0 C0 D1
B2* C2
(*) OBJECT_VERSION.DELETED is true
将C从A移至D:
generation: 0 1 2 3
A0
A2
/ |* \
B0 C0 D1
B2* C2 |
C3
等等...
此设计对具有不一致删除的异常开放:数据库不会保护自己不连接已删除和未删除的对象,或者将其中一个对象演变为已删除状态而不删除连接。在检查两个端点之前,您不会知道连接是否有效。如果您的数据是分层的,则可以使用“可达性模型”:如果可以从某个根对象访问对象,则不会删除该对象。您永远不会直接删除该对象 - 您只需删除它的所有连接。这适用于层次结构,例如文件夹/文件或类似文件,从“顶部”开始,向底部搜索,直到找到所需的对象。
“不可变”连接的替代方法是从OBJECT_VERSION继承CONNECTION_VERSION并在其中放置PARENT_ID / CHILD_ID,使用标识关系来确保diamond-shaped dependency is correctly modeled。如果您需要跟踪移动历史记录,这可能很有用。
这些只是广泛的笔触,我希望你能找到自己的方式......