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

问题描述 投票:1回答:1

我需要创建一个具有递归关系的数据模型,即每个用户有两个子用户,每个子用户又有两个子用户。这种行为在树上生长了很多次。我想使用MongoDB作为我的数据库。我已经读过,建议不要在文档中放置大量节点,因此建议将模型作为关系模型或使用其他数据库来实现该目标。你对我有什么建议?

database mongodb mongoose data-structures datamodel
1个回答
1
投票

我会说,这实际上取决于您的数据访问模式。您可以考虑(至少)两种情况

#1一个大文件

这使您在读取时获得最佳性能-您只需按ID或任何其他父级字段进行查询。建议进行简单的数据访问,例如获取整棵树,将整棵树更新为单个业务操作。缺点是子文档的查询和更新它们变得更加复杂(但仍然可能-array filters)。您需要记住的另一件事是,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

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

© www.soinside.com 2019 - 2024. All rights reserved.