Docs 菜单
Docs 主页
/
MongoDB Manual

数据建模

在此页面上

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

数据建模是指对数据库中的数据以及相关实体间的链接进行组织。MongoDB 中的数据具有灵活的模式模型,因此:

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

  • 字段的数据类型可能因集合中的文档而异。

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

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

灵活的模式在以下场景中非常有用:

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

  • 您的电子商务应用程序在显示产品时会显示最近的五个评论。您可以将最近的评论存储在与产品数据相同的集合中,并将较旧的评论存储在单独的集合中,因为较旧的评论不会频繁访问。

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

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

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

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

  1. 确定应用程序的工作负载。

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

  3. 应用设计模式。

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

要链接相关数据,您可以:

  • 在单个文档中嵌入相关数据。

  • 将相关数据存储在单独的集合中,并使用 引用进行访问。

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

具有包含所有相关信息的嵌入式字段的数据模型。

对于 MongoDB 中的许多使用案例,非规范化数据模型是最佳选择。

要了解嵌入文档优劣势,请参阅嵌入式数据模型。

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

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

使用引用链接文档的数据模型。“联系”文档和“访问”文档都包含对“用户”文档的引用。

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

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

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

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

如果重复数据不常更新,则只需很少的额外工作即可保持两个集合的一致性。不过,如果重复数据经常更新,则使用引用来链接相关数据可能是更好的方法。

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

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

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

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

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

在设计模式时,请考虑部署的硬件,尤其是可用的 RAM。较大的文档使用更多的 RAM,这可能会导致您的应用程序从磁盘读取数据并降低性能。在设计模式时,请尽可能让查询仅返回相关字段。这种做法可确保应用程序的工作集不会不必要地变大。

在 MongoDB 中,写入操作在单个文档级别上是原子性的,即使该操作修改单个文档中的多个嵌入文档也是如此。这意味着,如果更新操作影响多个子文档,则所有这些子文档都会更新,或者操作完全失败,不会进行更新。

具有嵌入式数据的非规范化数据模型将所有相关数据组合在单个文档中,而不是跨多个文档和集合进行规范化。此数据模型支持原子操作,而在规范化模型中执行此类操作会影响多个文档。

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

  • 参加MongoDB University 的“数据建模”课程,学习如何构建文档并定义模式。

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

    下载内容包括以下资源:

    • 介绍使用 MongoDB 进行数据建模的方法

    • 白皮书介绍了从 RDBMS 数据模型迁移到 MongoDB 的最佳实践和注意事项

    • 引用 MongoDB 模式及其 RDBMS 等效模式

    • 应用程序现代化记分卡

后退

分片集群