MongoDB 数据模型

MongoDB 的数据是非常的灵活的,在一个集合中的文档可以是多种多样的。它们不需要具有相同的一组字段或结构。集合文档中的公共字段可能包含不同类型的数据。

这种灵活性有助于将文档映射到实体或对象。每个文档都可以匹配所表示实体的数据字段,即使该文档与集合中的其他文档有很大的差异。

数据模型设计

MongoDB 提供两种类型的数据模型:

  • 嵌入式数据模型
  • 规范化数据模型

根据要求,我们可以在设计准备文档时使用两种模型中的任意一种。

嵌入式数据模型

在此模型中,我们可以将所有相关数据“嵌入”在单个文档中,也称为非规范化数据模型。

嵌入式数据模型允许应用程序在同一个数据库记录中存储相关信息。因此,应用程序可能需要发出更少的查询和更新来完成常见操作。

通常,在以下情况下使用嵌入式数据模型:

  • 实体之间存在“包含”关系。 见与嵌入文档建立一对一关系模型。
  • 实体之间有一对多的关系。在这些关系中,“多个”或子文档始终与“一个”或父文档一起出现或在其上下文中查看。 见与嵌入文档建立一对多关系模型。

一般来说,嵌入为读取操作提供了更好的性能,并且能够在单个数据库操作中请求和检索相关数据。嵌入式数据模型使得在单个原子写入操作中更新相关数据成为可能。

例如,假设我们在三个不同的文档中获取员工的详细信息,即 Personal_details、Contact 和 Address,我们可以将所有三个文档嵌入到一个文档中,如下所示

{
    _id: ,
    Emp_ID: "10025AE336"
    Personal_details:{
        First_Name: "Radhika",
        Last_Name: "Sharma",
        Date_Of_Birth: "1995-09-26"
    },
    Contact: {
        e-mail: "radhika_sharma.123@gmail.com",
        phone: "9848022338"
    },
    Address: {
        city: "Hyderabad",
        Area: "Madapur",
        State: "Telangana"
    }
}

规范化数据模型

规范化数据模型使用文档之间的 引用来描述关系。

通常,以下场景使用规范化数据模型:

  • 当嵌入将导致重复数据,但不会提供足够的读取性能优势,超过重复的影响。
  • 表示更复杂的多对多关系。
  • 为大型分层数据集建模。

例如,我们可以使用规范化模型重写上述文档:

Employee:

{
    _id: <ObjectId101>,
    Emp_ID: "10025AE336"
}

Personal_details:

{
    _id: <ObjectId102>,
    empDocID: " ObjectId101",
    First_Name: "Radhika",
    Last_Name: "Sharma",
    Date_Of_Birth: "1995-09-26"
}

Contact:

{
    _id: <ObjectId103>,
    empDocID: " ObjectId101",
    e-mail: "radhika_sharma.123@gmail.com",
    phone: "9848022338"
}

Address:

{
    _id: <ObjectId104>,
    empDocID: " ObjectId101",
    city: "Hyderabad",
    Area: "Madapur",
    State: "Telangana"
}

在 MongoDB 中设计 Schema 时的注意事项

  • 根据用户要求设计我们的架构。
  • 如果实际情况中我们需要一起使用对象,那么将它们合并到一个文档中。否则将它们分开(但确保不需要连接)。
  • 复制数据(但是不要全部复制),因为与计算时间相比,磁盘空间便宜。
  • 在写入时加入,而不是在读取时加入。
  • 针对最常见的用例优化我们的架构。
  • 在模式中进行复杂的聚合。

示例

假设客户需要为其博客/网站设计数据库,并查看 RDBMS 和 MongoDB 模式设计之间的差异。网站有以下要求。

  • 每个帖子都有唯一的标题、描述和网址。
  • 每篇文章都可以有一个或多个标签。
  • 每个帖子都有其发布者的名称和喜欢的总数。
  • 每个帖子都有用户给出的评论以及用户的姓名、消息、评论时间和是否喜欢。
  • 在每个帖子上,可以有零个或多个评论。

在 RDBMS 模式中,针对上述要求的设计将至少包含三个表。

rdbms 设计结构

在 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
      }
   ]
}

因此,在显示数据时,在 RDBMS 中您需要连接三个表,而在 MongoDB 中,只需要显示一个集合中的数据。

查看笔记

扫码一下
查看教程更方便