翻译或纠错本页面

一对多关系建模: 内嵌文档模型

On this page

概述

MongoDB的数据具有 灵活的模式集合 本身没有对文档结构的规则性校验。 但是你建模时所作的决定会影响到应用程序的性能和数据库的处理能力。参见 数据建模理论 以更多的了解一些关于MongoDB数据建模全面介绍。

这篇文章讲述了如何使用 内嵌 文档模型来描述数据的关联性。

范式

让我们来看一个针对于顾客和其多个地址关系建模的一个例子。通过这个例子中我们可以明白在需要同时看到多个数据记录的场景下,使用内嵌会比使用引用更有优越性。在这个顾客和地址的一对多的关系中,一个 patron 有多个 address 记录。

在一个规范化的数据模型中, address 文档包含一个对父文档 patron 的引用。

{
   _id: "joe",
   name: "Joe Bookreader"
}

{
   patron_id: "joe",
   street: "123 Fake Street",
   city: "Faketon",
   state: "MA",
   zip: "12345"
}

{
   patron_id: "joe",
   street: "1 Some Other Street",
   city: "Boston",
   state: "MA",
   zip: "12345"
}

假如 address 信息会经常和 name 字段一起被查询出来并显示, 那么应用程序必须发出额外的请求去解析并读取父文档。在这里更好的选择是把 address 数据直接内嵌到 patron 文档里面,如下所示:

{
   _id: "joe",
   name: "Joe Bookreader",
   addresses: [
                {
                  street: "123 Fake Street",
                  city: "Faketon",
                  state: "MA",
                  zip: "12345"
                },
                {
                  street: "1 Some Other Street",
                  city: "Boston",
                  state: "MA",
                  zip: "12345"
                }
              ]
 }

With the embedded data model, your application can retrieve the complete patron information with one query.