文档菜单
文档首页
/
MongoDB 手册

数据建模

本页内容

  • 用例
  • 模式设计:关系数据库和文档数据库之间的差异
  • 规划您的模式
  • 链接相关数据
  • 嵌入式数据
  • 引用
  • 其他数据建模注意事项
  • 数据重复和一致性
  • 索引
  • 硬件约束
  • 单个文档原子性
  • 了解更多

数据建模是指数据库内部数据的组织以及相关实体之间的链接。MongoDB 的数据具有 灵活的模式模型,这意味着

  • 单个 集合 中的文档不需要具有相同的字段集。

  • 集合中的文档字段的数据类型可能不同。

通常,集合中的文档具有相似的结构。为了确保数据模型的一致性,您可以创建模式验证规则。

灵活的数据模型让您可以根据应用程序的需求组织数据。MongoDB是一个文档数据库,这意味着您可以在对象和数组字段中嵌入相关数据。

灵活的模式在以下场景中很有用

  • 您的公司跟踪每个员工所在的部门。您可以在employee集合中嵌入部门信息,以在单个查询中返回相关信息。

  • 在显示产品时,您的电子商务应用程序显示五个最新的评论。您可以将最新的评论存储在产品数据相同的集合中,而将较旧的评论存储在单独的集合中,因为较旧的评论不太经常被访问。

  • 您的服装店需要为产品目录创建一个单页应用程序。不同的产品有不同的属性,因此使用不同的文档字段。但是,您可以将所有产品存储在同一个集合中。

当您为MongoDB等文档数据库设计模式时,需要考虑与关系数据库的一些重要差异。

关系数据库行为
文档数据库行为
您必须在插入数据之前确定表的模式。
随着应用程序需求的变化,您的模式可以随着时间的推移而变化。
您通常需要连接多个表中的数据,以返回应用程序所需的数据。
灵活的数据模型可以让您存储数据以匹配应用程序返回数据的方式,并避免连接。避免跨多个集合的连接可以提高性能并减少您的部署工作量。

为确保您的数据模型具有逻辑结构并实现最佳性能,在将数据库用于生产规模之前,请先规划您的模式。为了确定您的数据模型,请使用以下模式设计过程:

  1. 识别应用程序的工作负载.

  2. 映射集合中对象之间的关系.

  3. 应用设计模式.

当您在MongoDB中设计数据模型时,请考虑文档的结构以及您的应用程序使用相关实体数据的方式。

要链接相关数据,您可以选择以下方式之一:

  • 将相关数据内嵌到单个文档中。

  • 将相关数据存储在单独的集合中,并通过引用.

嵌入式文档将相关数据存储在单个文档结构中。一个文档可以包含数组和相关数据的子文档。这些被称为非规范化的数据模型允许应用程序通过单个数据库操作检索相关数据。

Data model with embedded fields that contain all related information.

在MongoDB的许多用例中,非规范化数据模型是最优的。

要了解嵌入式文档的优缺点,请参阅嵌入式数据模型。

参考通过包含从一个文档到另一个文档的链接,称为参考,来存储数据之间的关系。例如,在orders集合中的customerId字段指示对customers集合中文档的引用。

应用程序可以解析这些参考以访问相关数据。从广义上讲,这些是规范化数据模型。

Data model using references to link documents. Both the ``contact`` document and the ``access`` document contain a reference to the ``user`` document.

要了解使用参考的优缺点,请参阅参考。

以下因素可以影响您规划数据模型的方式。

当您在一个文档中嵌入相关数据时,您可能会在两个集合之间重复数据。数据重复允许您的应用程序在单个查询中查询多个实体的相关信息,同时在模型中将实体逻辑上分离。

例如,一个products集合存储了产品文档中最近的五条评论。这些评论也存储在一个reviews集合中,该集合包含所有产品评论。当写一条新评论时,发生以下写操作

  • 评论被插入到reviews集合中。

  • 使用$pop$push更新products集合中最近评论的数组。

如果重复数据更新不频繁,则保持两个集合一致性的额外工作量最小。但是,如果重复数据更新频繁,使用参考来链接相关数据可能是一个更好的方法。

在复制数据之前,请考虑以下因素

  • 重复数据需要更新的频率。

  • 数据重复时的读取性能优势。

要了解更多信息,请参阅处理重复数据。

为了提高应用程序运行频繁的查询的性能,在常用查询字段上创建索引。随着应用程序的增长,监控您的部署的索引使用情况,以确保您的索引仍然支持相关的查询。

在设计您的模式时,请考虑您的部署的硬件,特别是可用的RAM量。较大的文档需要更多的RAM,这可能导致您的应用程序从磁盘读取并降低性能。在可能的情况下,设计您的模式以便查询只返回相关字段。这种做法确保您的应用程序的工作集不会无谓地变大。

在MongoDB中,写入操作在单个文档级别是原子的,即使操作修改了单个文档内的多个嵌套文档。这意味着如果更新操作影响了多个子文档,要么所有这些子文档都会更新,要么整个操作失败且不发生任何更新。

非规范化数据模型与嵌套数据结合,在一个文档中而不是在多个文档和集合中规范化地组合所有相关数据。这种数据模型允许原子操作,与规范化模型不同,后者会影响多个文档。

有关更多信息,请参阅原子性。

  • 在MongoDB大学的数据建模课程中学习如何构建文档和定义模式。

  • 有关MongoDB数据建模的更多信息,请下载MongoDB应用现代化指南

    下载内容包括以下资源

    • MongoDB数据建模方法的演示

    • 关于从RDBMS数据模型迁移到MongoDB的最佳实践和白皮书

    • MongoDB模式及其RDBMS等价物的参考

    • 应用现代化评分卡

返回

分片集群