引用通过包含从一个文档到另一文档的链接(称为引用)存储数据之间的关系。应用程序可以解析这些引用以访问权限相关数据。在以下示例中,contact 和access 文档包含对user 文档的引用。
引用则会产生规范化的数据模型,其原因是数据被分为多个集合,且不会重复。
用例
尽管非规范化数据模型适用于MongoDB中的大多数使用案例,但在以下情况下,请考虑使用引用而不是嵌入式数据:
内嵌会导致数据重复,但无法提供足够的读取性能优势来抵消重复的不利影响时。例如,当嵌入式数据经常变化时。
您需要表示复杂的多对多关系或大型分层数据集。
您需要经常单独查询相关实体。
大量集合
在某些情况下,您可以选择将相关信息存储在多个集合中,而不是单个集合中。
假设有这样一个示例集合 logs,其中存储各种环境和应用程序的日志文档。logs 集合包含以下形式的文档:
{ log: "dev", ts: ..., info: ... } { log: "debug", ts: ..., info: ...}
如果文档总数较少,您可以按类型将文档分组到集合中。对于日志,请考虑使用不同的日志集合,例如logs_dev 和logs_debug 。
通常,拥有大量集合不会导致明显的性能损失,并且会带来良好的性能。非重复处理批处理重要。
使用具有大量集合的模型时,请考虑以下行为:
查询规范化数据模型
为了查询多个集合中的规范化数据,MongoDB 提供了以下聚合阶段:
有关规范化数据模型的示例,请参阅使用文档引用建立一对多关系模型。
有关各种树模型的示例,请参阅对树结构进行建模。