如何在CouchDB中存储树?
CouchDB Wiki有一个How_to_store_hierarchical_data页面描述了一种方法,但作者说到移动节点:
这部分让我有点担心,因为有可能有人 在你移动的过程中,else可以添加一个新的子节点 子树,让新节点自己悬挂在子树中 不再存在。我不确定避免的最佳方法 这样的问题。
有这么大的问题,这真的是存储树木的最佳做法吗?
我正在考虑通过向每个节点添加parentId
来实现我的树,这是不是很糟糕?
(我意识到它类似于this question,但是移动节点时接受的答案有未指明的行为)
答案 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
函数将是徒劳的,但应该是可行的。
我已经测试了其中的一些方法,但我还没有完全充实。如果你在任何这些路径上走得更远,我很想知道你的进步/发现。