我需要建立一个具有递归关系的数据模型,方法是每个用户有两个子用户,每个子用户有另外两个子用户。这种行为屡屡发生在树上。我想使用MongoDB作为我的数据库。我读过的那是不推荐的,把一大组节点放在一个文档中,所以我想把make模型作为一个关系模型,或者使用其他数据库来实现这个目标。你给我什么建议?
发布于 2020-03-04 01:51:31
我想说,它确实取决于您的数据访问模式。你可以考虑(至少)两种情况
#1一份大文件
在读取方面,这给了您最好的性能--您只需通过id或任何其他父级字段进行查询。对于简单的数据访问,如获取整棵树,将整棵树更新为单一的业务操作,都是推荐的。缺点是,通过子文档进行查询和更新它们变得更加复杂(但仍然有可能-- 阵列滤波器)。您需要记住的另一件事是,MongoDB对于单个文档大小有16 MB的限制。这是很多,但你需要知道你的树能长多远。
#2“关系”方式
您可以在同一个集合中存储多个文档,每个文档都可以指向它的父集合:
{
_id: 1,
name: "root",
parent: null
},
{
_id: 2,
name: "child",
parent: 1
}这将使处理子文档更容易(当您的业务操作不包括父文档时)。缺点是查询获取树的速度要慢一些,因为数据需要“连接”,但是MongoDB使您可以通过运行$graphLookup来检索其子树的父级。
{
$graphLookup: {
from: "sameCollection",
startWith: "$parent",
connectFromField: "parent",
connectToField: "child",
as: "tree"
}
}$graphLookup递归工作,您可以指定maxDepth。
您还可以考虑混合方法-分别存储树以进行快速读取,并为子级操作保留数据关系。在这种情况下,面临的挑战是如何处理数据更新,因为同一值在多个文档中重复。您可以考虑最终的一致性模型,比如根据当前数据每小时重建一次树,或者在重建子数据时触发树的再处理--这实际上取决于您的业务需求。
https://stackoverflow.com/questions/60517478
复制相似问题