首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在MongoDB中将其建模为树还是关系?

我应该在MongoDB中将其建模为树还是关系?
EN

Stack Overflow用户
提问于 2020-03-04 00:32:10
回答 1查看 86关注 0票数 1

我需要建立一个具有递归关系的数据模型,方法是每个用户有两个子用户,每个子用户有另外两个子用户。这种行为屡屡发生在树上。我想使用MongoDB作为我的数据库。我读过的那是不推荐的,把一大组节点放在一个文档中,所以我想把make模型作为一个关系模型,或者使用其他数据库来实现这个目标。你给我什么建议?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-04 01:51:31

我想说,它确实取决于您的数据访问模式。你可以考虑(至少)两种情况

#1一份大文件

在读取方面,这给了您最好的性能--您只需通过id或任何其他父级字段进行查询。对于简单的数据访问,如获取整棵树,将整棵树更新为单一的业务操作,都是推荐的。缺点是,通过子文档进行查询和更新它们变得更加复杂(但仍然有可能-- 阵列滤波器)。您需要记住的另一件事是,MongoDB对于单个文档大小有16 MB的限制。这是很多,但你需要知道你的树能长多远。

#2“关系”方式

您可以在同一个集合中存储多个文档,每个文档都可以指向它的父集合:

代码语言:javascript
复制
{
    _id: 1,
    name: "root",
    parent: null    
},
{
    _id: 2,
    name: "child",
    parent: 1        
}

这将使处理子文档更容易(当您的业务操作不包括父文档时)。缺点是查询获取树的速度要慢一些,因为数据需要“连接”,但是MongoDB使您可以通过运行$graphLookup来检索其子树的父级。

代码语言:javascript
复制
 {
     $graphLookup: {
        from: "sameCollection",
        startWith: "$parent",
        connectFromField: "parent",
        connectToField: "child",
        as: "tree"
     }
 }

$graphLookup递归工作,您可以指定maxDepth

您还可以考虑混合方法-分别存储树以进行快速读取,并为子级操作保留数据关系。在这种情况下,面临的挑战是如何处理数据更新,因为同一值在多个文档中重复。您可以考虑最终的一致性模型,比如根据当前数据每小时重建一次树,或者在重建子数据时触发树的再处理--这实际上取决于您的业务需求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60517478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档