使用其他关系数据库,该表如下所示:
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 : [ ... ]
}
]
}
这样文档只包含一条记录。如果水平太深,它会带来一些麻烦吗?在这个设计中,我如何快速找到一个项目?这种设计的优点是什么?
答案 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
}
使用上述模式,您可以轻松更新树中的任何元素,但您需要在客户端上构建树。 您的架构在原子更新方面存在问题但会更快地运行,因为您不需要在客户端上构建树,并且因为嵌入通常更快+分页可以轻松完成。我的架构对于更新更灵活,但对于读取不是很好。选择什么取决于某些情况。