MongoDB数据模型

2年前 (2024-04-27)
在 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网站站点" rel="nofollow" /> {
    _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网站站点" rel="nofollow" /> {
    _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
       }
    ]

}