Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 树状数据的表设计_C#_.net_Database Design_Mongodb - Fatal编程技术网

C# 树状数据的表设计

C# 树状数据的表设计,c#,.net,database-design,mongodb,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"

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

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 : [ ... ]
      }
   ]
}
db.items.update({_id: 1, Children.ID: 2 }, {Children.$.Name: "b"},false,false);

使文档只包含一条记录。如果水位太深会不会带来麻烦?在这种设计中,如何快速定位一个项目?这种设计的优点是什么?

如果使用上面的模式,那么嵌套级别>1的元素的原子更新将遇到问题。您可以更新嵌套级别1上的任何文档,如下所示:

{
   ID : 1,
   Name : "root",
   Children : [
      {
         ID : 2
         Name : "a",
         Children : [ ... ]
      },
      {
         ID : 3
         Name : "b",
         Children : [ ... ]
      }
   ]
}
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
}
使用上述模式,您可以轻松地更新树中的任何元素,但您需要在客户端构建树。 您的模式在原子更新方面有问题,但会工作得更快,因为您不需要在客户端构建树,而且由于嵌入通常更快,所以分页可以很容易地完成。我的模式对于更新更灵活,但对于读取来说不是很好。选择什么取决于特定的情况