【问题标题】:Should I model this as tree or as relational in MongoDB?我应该在 MongoDB 中将其建模为树还是关系?
【发布时间】:2020-06-16 10:32:26
【问题描述】:

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

【问题讨论】:

    标签: database mongodb mongoose data-structures datamodel


    【解决方案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

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

    【讨论】:

    • 非常感谢您的回答。我需要考虑一下,但现在信息已经足够了。
    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多