【问题标题】:table design for tree-like data树状数据的表设计
【发布时间】:2011-12-30 04:55:37
【问题描述】:

使用其他关系型数据库,表格如下:

ID        Name         ParentID
1         root          NULL
2         a              1
3         b              1
4         aa             2
5         aaa            4

在使用mongo db时,如果我们这样设计文档会不会更容易:

{
   ID : 1,
   Name : "root",
   Children : [
      {
         ID : 2
         Name : "a",
         Children : [ ... ]
      },
      {
         ID : 3
         Name : "b",
         Children : [ ... ]
      }
   ]
}

这样文档只包含一条记录。层次太深会不会带来麻烦?而在这个设计中,我怎样才能快速找到一件物品呢?这种设计有什么好处?

【问题讨论】:

    标签: c# .net database-design mongodb


    【解决方案1】:

    如果您使用上面的架构,您将无法对嵌套级别 > 1 的元素进行原子更新。您可以像这样更新嵌套级别 1 的任何文档:

    db.items.update({_id: 1, Children.ID: 2 }, {Children.$.Name: "b"},false,false);
    

    但是对于嵌套级别 = 2,您不能这样做,因为位置运算符现在不支持它(但我猜将来会支持)。

    您当然可以随时更新整个文档,但这会导致并发问题。

    还有另一种架构方法可以避免这种情况:

    {
       _id : 1,
       Name : "root",
       ParentId: null
    },
    {
       _id : 2,
       Name : "nested",
       ParentId: 1
    }
    

    使用上述架构,您可以轻松更新树中的任何元素,但您需要在客户端构建树。 您的架构在原子更新方面存在问题,但工作速度会更快,因为您不需要在客户端构建树,并且因为嵌入通常更快+分页可以轻松完成。我的模式对于更新更灵活,但对于读取不是很好。选择什么实际上取决于某些情况。

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2021-10-02
      • 1970-01-01
      相关资源
      最近更新 更多