arangodb:节点合并历史:最佳方法
arangodb: node merge history: best approach
我们正在构建联系人管理应用程序。每个联系人都是一个节点。如果发现 2 个或更多联系人是重复的,我们希望提供将它们合并到单个节点中的能力。此外,我们希望保持合并前的节点状态,以便我们可以在需要时撤消合并 (*)。
我们建议通过创建一个新节点并使用 "merged_into" 边将旧节点链接到它,并将状态 属性 设置为 "removed" 来对此建模。
现在我们有两个选择:
我们将两个合并节点的所有现有边复制到新节点
我们没有。
选项 2 提供了更简单的数据结构,但是它使我们所有的查询都变得更加复杂。因为我们必须通过潜在的多级合并节点返回以获取所有边
选项 1 会保持查询不变,但会引入很多额外的边。
我们还在考虑第三种选择,即创建完整数据库的副本,并折叠所有合并的节点。即只是当前联系人的视图。这需要与主数据库保持同步。
如有任何 advice/suggestions 处理此问题的最佳方法,我们将不胜感激。
我还想推荐一个新的 "collapse" 查询功能,这将使选项 2 更容易工作....像这样:
select out("attended_class") collapse("merged_into") from 10#12
这将折叠指定的边缘,直到没有进一步的出站 "merged_into" 边缘,从而检索附加到先前(预合并)节点的所有边缘
- 为了让事情简单我们不允许在新节点上定义任何边后进行取消合并操作
亲切的问候
斯瓦米凯瓦拉
我认为这个问题取决于您期望合并发生的频率。
如果他们很少选择选项 1 和 运行 不时删除剩余内容的 cron 作业。
如果它们经常出现,您应该选择选项 2,因为 merging/unmerging 速度要快得多。
您仍然应该使用 "cleans" 您的数据的 cron-job 并越过边缘移动到合并的节点(一旦明确它们不会被取消合并)。
顺便说一句:
如果节点的属性相同(除了它们的 _key)并且也不必合并,您可能可以通过一个简单的技巧来逃脱:
每当节点 A 应该与节点 B 合并时,在集合 merged
中添加一条连接 A 和 B 的边,并将 B 标记为 "removed"。
然后修改您的查询以检查集合中的节点是否有边 merged
将它们放入查询的起始顶点集中。如果要撤消合并,只需删除这条边即可。如果要将其他边添加到合并节点,则可以将其添加到任一节点。这将使取消合并节点成为可能,即使已经添加了边。
我们正在构建联系人管理应用程序。每个联系人都是一个节点。如果发现 2 个或更多联系人是重复的,我们希望提供将它们合并到单个节点中的能力。此外,我们希望保持合并前的节点状态,以便我们可以在需要时撤消合并 (*)。
我们建议通过创建一个新节点并使用 "merged_into" 边将旧节点链接到它,并将状态 属性 设置为 "removed" 来对此建模。
现在我们有两个选择:
我们将两个合并节点的所有现有边复制到新节点
我们没有。
选项 2 提供了更简单的数据结构,但是它使我们所有的查询都变得更加复杂。因为我们必须通过潜在的多级合并节点返回以获取所有边
选项 1 会保持查询不变,但会引入很多额外的边。
我们还在考虑第三种选择,即创建完整数据库的副本,并折叠所有合并的节点。即只是当前联系人的视图。这需要与主数据库保持同步。
如有任何 advice/suggestions 处理此问题的最佳方法,我们将不胜感激。
我还想推荐一个新的 "collapse" 查询功能,这将使选项 2 更容易工作....像这样:
select out("attended_class") collapse("merged_into") from 10#12
这将折叠指定的边缘,直到没有进一步的出站 "merged_into" 边缘,从而检索附加到先前(预合并)节点的所有边缘
- 为了让事情简单我们不允许在新节点上定义任何边后进行取消合并操作
亲切的问候
斯瓦米凯瓦拉
我认为这个问题取决于您期望合并发生的频率。 如果他们很少选择选项 1 和 运行 不时删除剩余内容的 cron 作业。
如果它们经常出现,您应该选择选项 2,因为 merging/unmerging 速度要快得多。 您仍然应该使用 "cleans" 您的数据的 cron-job 并越过边缘移动到合并的节点(一旦明确它们不会被取消合并)。
顺便说一句: 如果节点的属性相同(除了它们的 _key)并且也不必合并,您可能可以通过一个简单的技巧来逃脱:
每当节点 A 应该与节点 B 合并时,在集合 merged
中添加一条连接 A 和 B 的边,并将 B 标记为 "removed"。
然后修改您的查询以检查集合中的节点是否有边 merged
将它们放入查询的起始顶点集中。如果要撤消合并,只需删除这条边即可。如果要将其他边添加到合并节点,则可以将其添加到任一节点。这将使取消合并节点成为可能,即使已经添加了边。