Arangodb:节点合并历史:最佳方法



我们正在构建一个联系人管理应用程序。每个联系人是一个节点。如果发现2个或更多的联系人是重复的,我们希望提供将它们合并到单个节点的功能。此外,我们希望保持合并前的节点状态,以便我们可以在需要时撤销合并(*)。

我们建议通过创建一个新节点并将旧节点与"merged_into"边连接起来,并将状态属性设置为"removed"来建模。

现在我们有两个选项:

  1. 我们将两个合并节点的所有现有边复制到新节点

  2. 我们没有。

选项2提供了一个更简单的数据结构,但是它使我们所有的查询更加复杂。因为我们需要返回到合并节点的多个层次来获取所有的边

选项1将保持查询相同,但会引入许多额外的边。

我们还在考虑第三种选择,即创建一个完整数据库的副本,所有合并的节点都折叠起来。也就是说,只是当前联系人的视图。这将需要与主数据库保持同步。

对于如何处理这件事,我将非常感激。

我还想建议一个新的"折叠"查询功能,这将使选项2更容易工作....像这样:

select out("attended_class") collapse("merged_into") from 10#12

将折叠指定的边,直到没有进一步的出站"merged_into"边,从而检索附加到先前(预合并)节点的所有边

  • 为了保持简单,我们不允许在新节点
  • 上定义任何边后进行unmerge操作。

亲切的问候

哲人Kevala

我认为这个问题取决于你期望合并发生的频率。如果它们很少出现,请使用选项1,并运行一个cron作业,不时地删除剩余的内容。

如果它们经常出现,你应该选择选项2,因为合并/取消合并要快得多。您仍然应该使用一个cron-job来"清理"您的数据并移动到合并节点的边缘(只要明确它们不会被合并)。

顺便说一句:如果节点的属性是相同的(除了它们的_key),并且不需要合并,那么您可以使用一个简单的技巧:

当节点A需要与节点B合并时,在连接A和B的集合merged中增加一条边,并将B标记为"已移除"。然后修改您的查询,检查是否有来自集合merged中的节点的边,将它们放入查询的起始顶点集合中。如果要撤销合并,只需删除此边即可。如果要在合并节点上添加其他边,则可以将其添加到任意一个节点上。这将使取消合并节点成为可能,即使已经添加了边。

相关内容

最新更新