我正在寻求有关围绕版本化数据设计数据模型的最佳方式的意见。将存在一对多和多对多的关系,这些关系在每个版本中都可能发生变化。
我正在寻求不同的策略,最终目标是进行高效的比较,并尽可能地仅存储增量。
我正在寻求有关围绕版本化数据设计数据模型的最佳方式的意见。将存在一对多和多对多的关系,这些关系在每个版本中都可能发生变化。
我正在寻求不同的策略,最终目标是进行高效的比较,并尽可能地仅存储增量。
这实际上是一个相当困难的问题。
版本控制对象很容易,但跟踪它们之间的连接就不那么容易了 - 您需要做出一些设计决策。例如:
此外,大多数“支持”表格可能也需要“版本控制感知”。
如果我是你,我可能会从以下起点开始工作:
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,使用标识关系来确保正确建模菱形依赖。如果需要跟踪移动的历史记录,则可能会有所帮助。
当然,这只是笼统的概述,希望您能找到自己的路线...