在CouchDB中存储树的最佳实践? (移动节点必须可靠)

时间:2012-01-04 05:26:17

标签: tree couchdb

如何在CouchDB中存储树?

CouchDB Wiki有一个How_to_store_hierarchical_data页面描述了一种方法,但作者说到移动节点:

  

这部分让我有点担心,因为有可能有人   在你移动的过程中,else可以添加一个新的子节点   子树,让新节点自己悬挂在子树中   不再存在。我不确定避免的最佳方法   这样的问题。

有这么大的问题,这真的是存储树木的最佳做法吗?

我正在考虑通过向每个节点添加parentId来实现我的树,这是不是很糟糕?

(我意识到它类似于this question,但是移动节点时接受的答案有未指明的行为)

1 个答案:

答案 0 :(得分:1)

这是我即将为BlueInk解决的问题。目前我正在使用物化路径并计划使用MapReduce动态生成站点地图(完整树)。

当移动树的分支时,最好使用“all_or_nothing:true”进行Bulk Update

...然而

  

全有或全无 - 要使用此模式,请将all_or_nothing: true包括为   请求的一部分。在验证失败的情况下,没有   文件将被保存。但是,它不会进行冲突检查,所以   即使这会造成冲突,也会提交所有文件。

...所以你可能最终会遇到冲突,你必须确保你的validate_doc_update没有完全阻止这种变化。

另一种选择是与变革“最终保持一致”。您可以在没有 all_or_nothing的情况下进行批量更新,并继续通过客户端代码处理MapReduce结果中的每个项目,直到它们全部移动为止。但是,考虑到有人可能想要将其移回等等,这可能是非常危险的。

无论采用哪种方法保留历史,如果出现问题,以前的位置都可能是谨慎的。

我在parent_id看到的唯一问题是构建项目完整路径所需的请求数。虽然除了一些使用_list键的简单MapReduce结果外,还可以使用[parent_id, _id]。构建_list函数将是徒劳的,但应该是可行的。

我已经测试了其中的一些方法,但我还没有完全充实。如果你在任何这些路径上走得更远,我很想知道你的进步/发现。