我正在寻找一些关于设计围绕版本化数据的数据模型的最佳方法的输入。会有一对多和多对多的关系,这些关系都可以在不同版本之间发生变化。
我正在寻找一些不同的策略,最终目标是高效的比较,如果可能的话,只存储增量。
发布于 2012-10-19 20:19:12
简介
这其实是一个相当困难的问题。
对对象进行版本控制很容易。版本控制它们之间的连接--您将不得不做出一些设计决策。例如:
最重要的是,大多数“支持”表可能也需要“版本感知”。
设计
如果我是你,我可能会从以下起点开始工作:

对象和连接之间的符号是https://stackoverflow.com/a/12037398/533120 (又名。继承、子类、泛化层次结构等)。
此设计的基本思想是支持“快照”、“还原”和“增量”功能:
查询应该是这样的:
示例
假设您必须放置对象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等等..。
一些思考
此设计容易出现不一致删除的异常情况:数据库不会保护自己不连接已删除和未删除的对象,也不会在不删除连接的情况下将其中一个对象演化为已删除的状态。在检查两个端点之前,您将不知道连接是否有效。如果您的数据是分层的,则可以使用“可达性模型”:如果可以从某个根对象到达对象,则不会删除对象。您从不直接删除对象--只需删除与它的所有连接即可。对于文件夹/文件或类似的层次结构,这可以很好地工作,从“顶部”开始,然后向底部搜索,直到到达所需的对象为止。
替代“不可变”连接的方法是从CONNECTION_VERSION继承OBJECT_VERSION并将父ID/子ID放在那里,使用标识关系来确保diamond-shaped dependency is correctly modeled。如果您需要跟踪移动的历史,这可能是有用的。
当然,这只是泛泛而谈,我希望你能找到自己的路.
https://stackoverflow.com/questions/12979778
复制相似问题