On this page
数据模型设计
在本页面
有效的数据模型可满足您的应用程序需求。文档结构的关键考虑因素是决定embed还是use references。
嵌入式数据模型
使用 MongoDB,您可以将相关数据嵌入单个结构或文档中。这些架构通常称为“非规范化”模型,并利用 MongoDB 的丰富文档。考虑下图:
嵌入式数据模型允许应用程序将相关信息存储在同一数据库 Logging。结果,应用程序可能需要发出较少的查询和更新来完成常见的操作。
通常,在以下情况下使用嵌入式数据模型:
您在实体之间具有“包含”关系。参见与嵌入式文档构建一对一关系模型。
您在实体之间存在一对多关系。在这些关系中,“许多”或子级文档始终与“一个”或父级文档一起出现或在上下文中查看。参见与嵌入式文档构建一对多关系模型。
通常,嵌入可为读取操作提供更好的性能,以及在单个数据库操作中请求和检索相关数据的能力。嵌入式数据模型使在单个原子写入操作中更新相关数据成为可能。
但是,将相关数据嵌入文档中可能会导致文档在创建后增长的情况。使用 MMAPv1 存储引擎,文档的增长会影响写入性能并导致数据碎片。
在 3.0.0 版中,MongoDB 使用2 大小分配的幂作为 MMAPv1 的默认分配策略,以解决文档增长的问题,从而最大程度地减少了数据碎片的可能性。有关详情,请参见2 大小分配的幂。此外,MongoDB 中的文档必须小于BSON 文档的最大大小。对于批量二进制数据,请考虑GridFS。
要与嵌入式文档进行交互,请使用dot notation“进入”嵌入式文档。有关访问数组和嵌入式文档中数据的更多示例,请参见查询数组中的数据和查询嵌入文档中的数据。
标准化数据模型
规范化的数据模型使用references描述文档之间的关系。
通常,使用标准化数据模型:
嵌入时将导致数据重复,但无法提供足够的读取性能优势,无法胜过重复的影响。
代表更复杂的多对多关系。
为大型分层数据集建模。
为了加入集合,MongoDB 提供了聚合阶段:
$lookup(从 MongoDB 3.2 开始可用)
$graphLookup(从 MongoDB 3.4 开始可用)
MongoDB 还提供了引用以跨集合连接数据。
有关规范化数据模型的示例,请参见具有文档引用的一对多关系模型。
有关各种树模型的示例,请参见模型树结构。