MongoDB数据模型

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

数据模型设计

MongoDB 提供了两种数据模型,分别是嵌入式数据模型和规范化数据模型,您可以根据需要使用其中的任何一种。

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

嵌入式数据模型

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

{
    _id: ObjectId("601f4be6e646844cd045c8a4"),
    Emp_ID: "10025AE336",
    Personal_details:{
        First_Name: "Radhika",
        Last_Name: "Sharma",
        Date_Of_Birth: "1995-09-26"
    },
    Contact: {
        e-mail: "biancheng.net@gmail.com",
        phone: "9848022338"
    },
    Address: {
        city: "Hyderabad",
        Area: "Madapur",
        State: "Telangana"
    }
}

规范化数据模型

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

Employee:

{
    _id: ObjectId("601f4be6e646844cd045c8a4"),
    Emp_ID: "10025AE336"
}

Personal_details:

{
    _id: ObjectId("601f50bae646844cd045c8a5"),
    empDocID: ObjectId("601f4be6e646844cd045c8a4"),
    First_Name: "Radhika",
    Last_Name: "Sharma",
    Date_Of_Birth: "1995-09-26"
}

Contact:

{
    _id: ObjectId("601f50bae646844cd045c8a6"),
    empDocID: ObjectId("601f4be6e646844cd045c8a4"),
    e-mail: "biancheng.net@gmail.com",
    phone: "9848022338"
}

Address:

{
    _id: ObjectId("601f50bae646844cd045c8a7"),
    empDocID: ObjectId("601f4be6e646844cd045c8a4"),
    city: "Hyderabad",
    Area: "Madapur",
    State: "Telangana"
}

【示例】假设我们需要为某个博客或网站进行数据库设计,网站的具体要求如下:
  • 每个帖子都有唯一的标题、描述和网址;
  • 每个帖子可以有一个或多个标签;
  • 每个帖子都有其发布者的名字和喜欢的人数;
  • 每个帖子都可以有零个或多个评论,评论中包括他们的名字、信息、数据、时间和喜好。

在使用关系型数据库来实现上述需求时至少需要创建三个表,如下图所示:

关系型数据库架构设计
图:关系型数据库架构设计

若使用 MongoDB 来实现上述需求,可以使用一个集合来实现,其结构如下:

{
    _id: POST_ID,
    title: TITLE_OF_POST,
    description: POST_DESCRIPTION,
    by: POST_BY,
    url: URL_OF_POST,
    tags: [TAG1, TAG2, TAG3],
    likes: TOTAL_LIKES,
    comments: [
       {
          user:'COMMENT_BY',
          message: TEXT,
          dateCreated: DATE_TIME,
          like: LIKES
       },
       {
          user:'COMMENT_BY',
          message: TEXT,
          dateCreated: DATE_TIME,
          like: LIKES
       }
    ]
}