也许你应该看看关系世界是如何解决这个问题的。我们可以通过首先将树节点转换为文档来获取他们的解决方案。这意味着对于一棵树
root 0
|-- top child I
+-- top child II
|-- second-level child 1
| +-- third-level child a
|-- second-level child 2
您将拥有六个树节点中每一个的文档。然后在描述树结构的文档中添加附加数据。
我受到了启发这个答案 https://stackoverflow.com/a/3363232/220060其中概述了三种方法,各有利弊。让我在这里展示这些方法如何应用于面向文档的数据库。
使用父 ID 的方法
添加字段parentId
其中包含父节点的文档 ID 或其他一些唯一值。
pros and cons:
+ easy to understand, cheap insert, cheap subtree move
- difficult to retrieve subtree
改进的先序树遍历
添加两个字段left
and right
包含遍历的索引。首先从根节点开始,赋1给left
,然后下降到top child I
并将 2 分配给left
。如果没有更多的孩子,则将下一个整数分配给right
。然后上一层并将下一个整数分配给right
.
有关更多详细信息,请参阅这个古老但仍然很棒的指南:Sitepoint 上修改的预序树遍历 https://www.sitepoint.com/hierarchical-data-database-2/.
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