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