我需要创建一个具有递归关系的数据模型,即每个用户有两个子用户,每个子用户又有两个子用户。这种行为在树上生长了很多次。我想使用MongoDB作为我的数据库。我已经读过,建议不要在文档中放置大量节点,因此建议将模型作为关系模型或使用其他数据库来实现该目标。你对我有什么建议?
我会说,这实际上取决于您的数据访问模式。您可以考虑(至少)两种情况
这使您在读取时获得最佳性能-您只需按ID或任何其他父级字段进行查询。建议进行简单的数据访问,例如获取整棵树,将整棵树更新为单个业务操作。缺点是子文档的查询和更新它们变得更加复杂(但仍然可能-array filters)。您需要记住的另一件事是,MongoDB的单个文档大小限制为16 MB。数量很多,但您需要知道树可以长到多远。
您可以将多个文档存储在同一集合中,每个文档都可以指向其父文档:
{
_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
。
您还可以考虑使用混合方法-分别存储树以进行快速读取,并保持数据关系以进行子级操作。这种情况下的挑战是如何处理数据更新,因为在多个文档中重复了相同的值。您可以考虑最终的一致性模型,例如根据当前数据每小时重建一次树,或者仅在重建子代时触发树重新处理-这实际上取决于您的业务需求。