【问题标题】:Mongodb: Store a tree as one nested document or store one document per node?Mongodb:将树存储为一个嵌套文档还是每个节点存储一个文档?
【发布时间】:2014-04-07 01:22:25
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: json jquery-ui mongodb tree


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 2015-06-20
      相关资源
      最近更新 更多