2

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

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

  • 存储它的另一种方法是将整个树存储为一个文档,其中子文档作为子文档。例如

    tree : {
        "title" : "root",
        "children" : [
            {
                "title" : "node_1",
                "children" : [
                    ...
                ]
            },
            {
                "title" : "node_2",
                "children" : [
                    ...
                ]
            }
        ]
    }
    

问题:推荐哪种方式存储树木?

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

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

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

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

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

class Node {
    private String title:
    private List<Node> children;
}
4

1 回答 1

4

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

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

于 2013-07-13T16:01:38.857 回答