Database design 图形和版本控制
我有一个有向图数据结构,我试图为每个顶点实现单独的版本控制。这创造了一些有趣的场景,我非常感谢你们的想法。具体来说,我希望解决遇到所述场景时系统的默认行为 请参见下图: 场景1:“空指针悖论” 顶点A回滚到版本1.0。由于此回滚将向下级联其子图,C将不再指向D。这可能会造成危险。行为是否应该:Database design 图形和版本控制,database-design,version-control,data-structures,graph,graph-theory,Database Design,Version Control,Data Structures,Graph,Graph Theory,我有一个有向图数据结构,我试图为每个顶点实现单独的版本控制。这创造了一些有趣的场景,我非常感谢你们的想法。具体来说,我希望解决遇到所述场景时系统的默认行为 请参见下图: 场景1:“空指针悖论” 顶点A回滚到版本1.0。由于此回滚将向下级联其子图,C将不再指向D。这可能会造成危险。行为是否应该: 1.1:删除边C->D,创建一个断开的图形 1.2:删除D,使E成为孤儿 1.3:删除D和E 1.4:在删除所有指向D(在本例中为E->D)的边之前,拒绝执行回滚 1.X:替代解决方案 场景2:“间接
- 1.1:删除边C->D,创建一个断开的图形
- 1.2:删除D,使E成为孤儿
- 1.3:删除D和E
- 1.4:在删除所有指向D(在本例中为E->D)的边之前,拒绝执行回滚
- 1.X:替代解决方案
- D现在是1.2版
- E现在是1.1版
- C现在是1.3版
- A现在是1.3版
- A现在是1.2版
- C现在是1.2版
- D现在是1.1版
- 2.1:将E回滚到1.0
- 2.2:由于版本危险而拒绝回滚,实际上损害了功能
- 2.X:替代解决方案
实际上,您唯一能做的就是对整个图形进行修订控制。对于单个节点,很难使用它。您所描述的所有问题都源于这样一个事实:您正在穿越事务层,在每个事务层中,您都有一个在特定时刻形成的一致图。如果您穿过这些层,允许顶点修订控制,那么您正在处理一罐沙丘大小的蠕虫。在我看来,这里的粒度有些混乱。如果仅对单个顶点进行版本设置,而不对图形进行版本设置,则回滚单个顶点不应影响图形的其余部分。如果,OTOH,您希望回滚整个图,那么您还应该对整个图进行版本设置 问题在于,如果只对单个顶点进行版本设置,则只能对单个顶点进行完整性保证,而不能对整个图形进行完整性保证。因此,如果如您所描述的那样,回滚单个顶点会“波及”整个图(或至少是连接的子图),那么就不能保证最终处于一致状态
这项研究似乎与您正在尝试的最接近,是关于XML的版本控制,然而,它只处理强类型树(低退化图),而不是一般的图。AntiCity是蓝图的版本化图实现(因此它也适用于neo4j),
请看:为没有更明确表示歉意。这里假设边属于顶点,并使用顶点进行版本控制。因此,通过扩展,子图根节点(如a)将根据其整个子图中的更改进行版本控制。如前所述,这实际上不仅创建了嵌套的完整性平面(或层),还创建了可以相交的多维完整性平面(或层)。这一点很明显,这个问题的任何可能的解决方案都超出了我个人的数学能力。在这一点上,我能看到的唯一可行的解决方案是:A)仅版本顶点,而不考虑它的子图和超图。本质上,值而非结构B)降级为树结构C)折衷,其中版本控制上下文被显式地为任何子图设置,但不允许嵌套上下文;或者,如果嵌套的上下文被更高级别的上下文忽略,因此数据结构和版本控制结构在某种程度上是分离的,您能给我指出您提到的研究吗?通过添加带有时间戳的新节点,对我来说,对整个图进行版本化似乎并不难-只需要一个列表(另一个节点?)创建修订时的所有节点(由时间戳+ID标识)。甚至可以让修订节点指向修订的所有节点?回滚基本上意味着查询某个修订节点的所有连接节点。