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

时间:2013-07-13 12:54:13

标签: json jquery-ui mongodb tree

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

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

  • 存储它的其他方式是将整个树存储为一个文档,子文件作为子文档。 e.g。

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

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

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

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

由于我打算使用JsTree在UI上显示这个树(你可以推荐一个更好的JsTree替代品),它需要嵌套格式的json数据(方式2),我想把数据存储在同样的方式而不是方式1.

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

每个节点的Jave对象如下:

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

1 个答案:

答案 0 :(得分:3)

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

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