也许你应该看看关系世界是如何解决这个问题的。我们可以通过首先将树节点转换为文档来采用他们的解决方案。这意味着对于一棵树
root 0
|-- top child I
+-- top child II
|-- second-level child 1
| +-- third-level child a
|-- second-level child 2
您将拥有六个树节点中的每一个的文档。然后在描述树结构的文档中添加额外的数据。
我受到了这个 SO 答案的启发,它概述了三种方法的优缺点。让我在这里展示这些方法如何应用于面向文档的数据库。
使用父 ID 的方法
添加一个parentId
包含文档 id 或父节点的其他一些唯一值的字段。
pros and cons:
+ easy to understand, cheap insert, cheap subtree move
- difficult to retrieve subtree
改进的先序树遍历
添加两个字段left
并right
包含遍历的索引。首先从根节点开始并分配 1 到left
,然后下降到top child I
并分配 2 到left
。如果没有更多的孩子,将下一个整数分配给right
。然后上一层并将下一个整数分配给right
。
有关更多详细信息,请参阅这个古老但仍然非常出色的指南:Modified Preorder Tree Traversal on Sitepoint。
pros and cons:
+ cheap retrieve of subtree, ordering of children guaranteed
- difficult to understand, expensive insert (repeat tree traversal)
将路径保存在节点中
使用一些唯一值(如文档 ID)并创建这些唯一值的路径,从根开始并下降到节点。例如,第二级孩子 2 的路径可能是"0/II/2"
. 或者创建一个数组['0', 'II', '2']
。
pros and cons:
+ cheap retrieve of subtree, cheap insert
- expensive subtree move