Database design 图形和版本控制

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:“空指针悖论”

顶点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:“间接影响”

顶点D已更新,因此以下内容保持不变:

  • D现在是1.2版
  • E现在是1.1版
  • C现在是1.3版
  • A现在是1.3版
顶点A现在回滚到版本1.2,因此以下内容适用:

  • 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标识)。甚至可以让修订节点指向修订的所有节点?回滚基本上意味着查询某个修订节点的所有连接节点。