Mongodb:将一棵树存储为一个嵌套文档还是每个节点存储一个文档?

Yat*_*oel 2 tree json jquery-ui mongodb

我正在使用 MongoDB,我想在其中存储各种树。

  • 存储树的一种方法是将每个节点存储为文档,并引用其子节点/父节点/祖先(如此处所述

  • 另一种存储方式是将整个树存储为一个文档,将子文档存储为子文档。例如

    tree : {
        "title" : "root",
        "children" : [
            {
                "title" : "node_1",
                "children" : [
                    ...
                ]
            },
            {
                "title" : "node_2",
                "children" : [
                    ...
                ]
            }
        ]
    }
    
    Run Code Online (Sandbox Code Playgroud)

问题:建议采用哪种方式存储树木?

以下是我要对数据执行的操作:

  • 添加节点
  • 删除一个节点
  • 更新一个节点
  • 获取整棵树的json

由于我计划使用JsTree在 UI 上显示此树(您可以推荐 JsTree 的更好替代方案),它需要嵌套格式的 json 数据(方式 2),因此我考虑以相同的方式存储数据,而不是方式 1。

如果我以方式 1 将 json 数据存储在数据库中,那么我将必须为每个文档/节点映射一个 java 对象,然后通过将每个父级指向其相应的子级来手动在 java 中创建一个树对象,然后将该 java-树对象返回 json 以获取嵌套的 json。

每个节点的 Jave 对象如下所示:

class Node {
    private String title:
    private List<Node> children;
}
Run Code Online (Sandbox Code Playgroud)

Der*_*ick 5

看起来您将在树中不同级别的嵌套节点中进行大量操作。尽管 MongoDB 可以存储您所描述的结构,但它不太擅长允许您在大量嵌套级别进行更新。

因此,我建议您将每个节点存储为它自己的文档,并查看存储父子关系的位置。请记住优化数据操作的模式。在这种情况下我会选择你的“方式1”。如果您不必对树进行大量更改,并且您说对树的读取操作比写入操作多 1000 倍,那么您可以考虑使用“方式 2”,只需处理更新节点所需的额外工作深几层。