【问题标题】:arangodb: node merge history: best approacharangodb:节点合并历史:最佳方法
【发布时间】:2015-08-04 06:54:05
【问题描述】:

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

我们建议通过创建一个新节点并使用“merged_into”边缘将旧节点链接到它,并将状态属性设置为“已移除”来对此进行建模。

现在我们有两个选择:

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

  2. 我们没有。

选项 2 提供了一个更简单的数据结构,但是它使我们所有的查询变得更加复杂。因为我们必须通过潜在的多级合并节点返回来获取所有边

选项 1 会保持查询不变,但会引入很多额外的边。

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

对于处理此问题的最佳方式的任何建议/建议,我们将不胜感激。

我还想建议一个新的“折叠”查询功能,它可以让选项 2 更轻松地工作......像这样:

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

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

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

亲切的问候

斯瓦米·凯瓦拉

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    我认为这个问题取决于您期望合并发生的频率。 如果他们很少使用选项 1 并运行一个不时删除剩菜的 cron 作业。

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

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

    当节点 A 应该与节点 B 合并时,在集合 merged 中添加一条边,连接 A 和 B,并将 B 标记为“已删除”。 然后修改您的查询以检查集合中的节点是否有边 merged 将它们放入查询的起始顶点集中。如果要撤消合并,只需删除此边即可。如果要将其他边添加到合并节点,则可以将其添加到任一节点。即使已将边添加到节点,这也可以取消合并节点。

    【讨论】:

      猜你喜欢
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2011-10-23
      • 2010-11-16
      • 2018-06-16
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多