DataModel(数据模型)——数据模型示例和模式(一)——文档之间的关系模型



  • 1)使用嵌入式文档表示的一对一关系模型
    假设下面的示例映射顾客和地址的关系。 该示例说明如果您需要在一个数据实体的上下文中查看另一个数据实体,通过引用来嵌入的优点。 在顾客和地址数据之间的这种一对一的关系中,地址属于顾客。
    在正规化数据模型中,地址文档包含对顾客文档的引用。

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

    如果经常使用name信息检索地址数据,那么因为使用引用,您的应用程序需要发出多个查询来解析引用。 更好的数据模型是将地址数据嵌入到顾客数据中,如以下文档中所示:

    {
       _id: "joe",
       name: "Joe Bookreader",
       address: {
                  street: "123 Fake Street",
                  city: "Faketon",
                  state: "MA",
                  zip: "12345"
                }
    }
    

    使用嵌入式数据模型,应用程序可以只通过一次查询就检索到完整的顾客信息。

    2)使用嵌入式文档表示的一对多关系模型
    假设下面的示例映射顾客和多个地址的关系。 该示例说明了如果您需要在一个数据实体的上下文中查看多个数据实体,使用嵌入比使用引用具有的优点。 在顾客和地址数据之间的这种一对多关系中,顾客具有多个地址实体。
    在正规化的数据模型中,地址文档包含对顾客文档的引用。

    {
       _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"
    }
    

    如果应用程序频繁地检索带有名称信息的地址数据,那么您的应用程序需要发出多个查询来解析引用。 更好的模式是将地址数据实体嵌入到顾客数据中,如以下文档中所示:

    {
       _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"
                    }
                  ]
     }
    

    使用嵌入式数据模型,应用程序可以只使用一次查询就检索到完整的顾客信息。

    3)使用文档引用表示的一对多关系模型
    假设下面的示例,它映射发布商和图书之间的关系。 该示例说明了在避免重复发行商信息方面使用引用比使用嵌入具有的优点。
    将发行商文档嵌入图书文档中会导致发行商数据重复,如以下文档所示:

    {
       title: "MongoDB: The Definitive Guide",
       author: [ "Kristina Chodorow", "Mike Dirolf" ],
       published_date: ISODate("2010-09-24"),
       pages: 216,
       language: "English",
       publisher: {
                  name: "O'Reilly Media",
                  founded: 1980,
                  location: "CA"
                }
    }
    
    
    {
       title: "50 Tips and Tricks for MongoDB Developer",
       author: "Kristina Chodorow",
       published_date: ISODate("2011-05-06"),
       pages: 68,
       language: "English",
       publisher: {
                  name: "O'Reilly Media",
                  founded: 1980,
                  location: "CA"
                }
    }
    

    要避免重复发行商数据,请使用引用,并将发行商信息从图书集合分离出来,保存在的单独集合中。
    当使用引用时,关系的增长决定了引用的存储位置。 如果每个发行商的图书数量很少(增长有限),则将图书的引用存储在发布商文档中有时可能很有用。 否则,如果每个发行商的图书数量是不限定的,则此数据模型将导致可变的,不断增长的数组,如以下示例所示:

    {
       name: "O'Reilly Media",
       founded: 1980,
       location: "CA",
       books: [12346789, 234567890, ...]
    }
    
    {
        _id: 123456789,
        title: "MongoDB: The Definitive Guide",
        author: [ "Kristina Chodorow", "Mike Dirolf" ],
        published_date: ISODate("2010-09-24"),
        pages: 216,
        language: "English"
    }
    
    {
       _id: 234567890,
       title: "50 Tips and Tricks for MongoDB Developer",
       author: "Kristina Chodorow",
       published_date: ISODate("2011-05-06"),
       pages: 68,
       language: "English"
    }
    

    为了避免可变的、不断增长的数组,将发行商的引用存储在图书文档中:

    {
       _id: "oreilly",
       name: "O'Reilly Media",
       founded: 1980,
       location: "CA"
    }
    
    {
       _id: 123456789,
       title: "MongoDB: The Definitive Guide",
       author: [ "Kristina Chodorow", "Mike Dirolf" ],
       published_date: ISODate("2010-09-24"),
       pages: 216,
       language: "English",
       publisher_id: "oreilly"
    }
    
    {
       _id: 234567890,
       title: "50 Tips and Tricks for MongoDB Developer",
       author: "Kristina Chodorow",
       published_date: ISODate("2011-05-06"),
       pages: 68,
       language: "English",
       publisher_id: "oreilly"
    }
    

    原文地址

    本帖下載内容已隐藏,请登入以查看隐藏内容!


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待