本页描述了一种数据模型,该数据模型使用嵌入式文档来描述所连接数据之间的一对多关系。将连接的数据嵌入单个文档中可以减少获取数据所需的读取操作次数。通常,您应该对架构进行结构设计,以便您的应用程序可以在一次读取操作中接收其所有必需的信息。
考虑以下映射顾客和多个地址关系的示例。该示例说明了如果您需要在另一个上下文中查看许多数据实体,则与引用相比,嵌入的优势。在patron
与
address
数据之间的一对多关系中,patron
拥有多个address
实体。
在规范化数据模型中,address
文档包含对该文档的引用patron
。
如果您的应用程序经常检索address
包含name
信息的数据
,则您的应用程序需要发出多个查询来解析引用。更好的方案是将address
数据实体嵌入到数据中patron
,如以下文档所示:
使用嵌入式数据模型,您的应用程序可以通过一个查询来检索完整的顾客信息。
嵌入式文档模式的潜在问题是,它可能导致大型文档,尤其是在嵌入式字段不受限制的情况下。在这种情况下,您可以使用子集模式仅访问应用程序所需的数据,而不是整个嵌入式数据集。
考虑一个电子商务网站,其中列出了产品评论:
评论按时间倒序排列。当用户访问产品页面时,应用程序将加载十条最近的评论。
您可以将收藏分为两个收藏,而不是将所有评论与产品一起存储:
该product
集合存储有关每个产品的信息,包括该产品的十个最新评论:
该review
馆藏存储了所有评论。每个评论都包含对其所撰写产品的引用。
通过将最近的十条评论存储在product
集合中,在调用集合时仅返回所需的全部数据子product
集。如果用户希望查看其他评论,则应用程序将调用该review
收藏集。
小费
在考虑将数据拆分到哪里时,数据中最常访问的部分应该放在应用程序首先加载的集合中。在此示例中,模式被划分为十个评论,因为这是默认情况下在应用程序中可见的评论数。
也可以看看
要了解如何使用子集模式对集合之间的一对一关系进行建模,请参阅 使用嵌入式文档对一对一关系进行建模。
使用包含更频繁访问的数据的较小文档可以减小工作集的整体大小。这些较小的文档可提高应用程序最常访问的数据的读取性能。
但是,子集模式会导致数据重复。在该示例中,评论在product
收藏夹和
reviews
收藏夹中都维护。必须采取额外的步骤来确保每个集合之间的评论是一致的。例如,当客户编辑其评论时,应用程序可能需要执行两项写操作:一项用于更新product
收藏集,另一项用于更新reviews
收藏集。
您还必须在应用程序中实现逻辑,以确保product
集合中的评论始终是该产品的十个最新评论。