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

Should I model this as tree or as relational in MongoDB?

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

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

#1 一大文件

这为您提供了最佳的读取性能 - 您只需按 ID 或任何其他父级字段进行查询。建议将其用于简单的数据访问,例如获取整棵树,将整棵树更新为单个业务操作。缺点是查询子文档并更新它们变得更加复杂(但仍然可能 - array filters)。您需要记住的另一件事是 MongoDB 对单个文档大小有 16 MB 的限制。这很多,但你需要知道你的树能长多远。

#2 "Relational" 方式

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

{
    _id: 1,
    name: "root",
    parent: null    
},
{
    _id: 2,
    name: "child",
    parent: 1        
}

这将使处理子文档更容易(当您的业务操作不包括父文档时)。缺点是查询获取树的速度会变慢,因为数据需要 "joined" 但是 MongoDB 使您有可能通过 运行 $graphLookup 检索父项及其子项:

 {
     $graphLookup: {
        from: "sameCollection",
        startWith: "$parent",
        connectFromField: "parent",
        connectToField: "child",
        as: "tree"
     }
 }

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

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