概述

在 MongoDB 中存储数据非常灵活,它与关系型数据库完全不同,在关系型数据库中,插入数据之前必须先确定数据表的结构并创建数据表。而 MongoDB 中对文档的结构没有强制要求,只要合理即可。

模型设计原则

MongoDB 提供了两种数据模型(数据模型是针对集合层面而言的),分别是嵌入式数据模型和规范化数据模型,您可以根据需要使用其中的任何一种。
在 MongoDB 中模型设计需要注意以下几点:

  1. 根据具体的项目需求来选择合适的设计模式;
  2. 如果是要同时使用的数据,您可以将它们合并到一个文档中或选择将它们分成若干个文档;
  3. 可以有适当的数据冗余,因为与计算时间相比,磁盘空间更便宜;
  4. 针对最常用的用例优化您的模型;
  5. 写入时执行连接,而不是读取时执行连接;
  6. 在模式中执行复杂聚合。

    嵌入式数据模型

    嵌入式数据模型也称为非规范化数据模型,在该模型中您可以将所有相关的数据存储到一个文档中,例如我们在三个不同的文档中分别存储了一个员工的个人信息、联系方式和地址等信息,您还可以将这些信息整合到一个文档中,如下所示:

    1. {
    2. _id: ObjectId("601f4be6e646844cd045c8a4"),
    3. Emp_ID: "10025AE336",
    4. Personal_details:{
    5. First_Name: "Radhika",
    6. Last_Name: "Sharma",
    7. Date_Of_Birth: "1995-09-26"
    8. },
    9. Contact: {
    10. e-mail: "biancheng.net@gmail.com",
    11. phone: "9848022338"
    12. },
    13. Address: {
    14. city: "Hyderabad",
    15. Area: "Madapur",
    16. State: "Telangana"
    17. }
    18. }

    规范化数据模型(引用数据模型)

    在规范化数据模型中,您可以通过引用来将原始文档与子文档关联起来,例如您可以将上面的文档信息以规范化数据模型重写为以下几个文档:

    1. {
    2. _id: ObjectId("601f4be6e646844cd045c8a4"),
    3. Emp_ID: "10025AE336"
    4. }
    1. {
    2. _id: ObjectId("601f50bae646844cd045c8a5"),
    3. empDocID: ObjectId("601f4be6e646844cd045c8a4"),
    4. First_Name: "Radhika",
    5. Last_Name: "Sharma",
    6. Date_Of_Birth: "1995-09-26"
    7. }
    1. {
    2. _id: ObjectId("601f50bae646844cd045c8a6"),
    3. empDocID: ObjectId("601f4be6e646844cd045c8a4"),
    4. e-mail: "biancheng.net@gmail.com",
    5. phone: "9848022338"
    6. }
    1. {
    2. _id: ObjectId("601f50bae646844cd045c8a7"),
    3. empDocID: ObjectId("601f4be6e646844cd045c8a4"),
    4. city: "Hyderabad",
    5. Area: "Madapur",
    6. State: "Telangana"
    7. }

    如何选择

    选择内嵌:

  7. 数据对象之间有包含关系 ,一般是数据对象之间有一对多或者一对一的关系 。

  8. 需要经常一起读取的数据。
  9. 有 map-reduce/aggregation 需求的数据放在一起,这些操作都只能操作单个 collection。

    选择引用:

  10. 当内嵌数据会导致很多数据的重复,并且读性能的优势又不足于覆盖数据重复的弊端 。

  11. 需要表达比较复杂的多对多关系的时候 。
  12. 大型层次结果数据集 嵌套不要太深。