树状数据的表设计

时间:2011-11-16 07:55:50

标签: c# .net database-design mongodb

使用其他关系数据库,该表如下所示:

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 : [ ... ]
      }
   ]
}

这样文档只包含一条记录。如果水平太深,它会带来一些麻烦吗?在这个设计中,我如何快速找到一个项目?这种设计的优点是什么?

1 个答案:

答案 0 :(得分:2)

如果您使用上面的模式,您将遇到具有嵌套级别>的元素的原子更新的麻烦。 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
}

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