Data Model

mongodb 中的数据具有灵活的模式。默认情况下, 集合不强制文档结构。这种灵活性为您提供了数据建模选项, 以满足您的应用程序及其性能要求。

  • 数据建模简介

介绍 mongodb 中的数据建模。

  • 架构验证

mongodb 提供了在更新和插入过程中进行架构验证的功能。

  • 数据建模概念

详细说明在确定数据模型时必须做出的决定的核心文档, 并讨论应考虑的因素。

  • 数据模型示例和模式

可用于构建 mongodb 文档的可能数据模型的示例。

  • 数据模型参考

用于 mongodb 应用程序开发人员的数据建模参考材料。

概览

数据建模的关键挑战是平衡应用程序的需求、数据库引擎的性能特征和数据检索模式。

在设计数据模型时, 始终考虑数据的应用程序使用情况 (即查询、更新和数据处理) 以及数据本身的固有结构。

灵活的架构

与 sql 数据库不同的是, 在插入数据之前, 必须确定并声明表的架构, 默认情况下, mongodb 的集合不需要其文档具有相同的架构。那是:

  1. 单个集合中的文档不需要具有相同的字段集, 并且字段的数据类型可能因集合中的文档而异。

  2. 若要更改集合中文档的结构, 如添加新字段、删除现有字段或将字段值更改为新类型, 请将文档更新为新结构。

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

但实际上, 集合中的文档共享类似的结构, 您可以在更新和插入操作期间对集合强制实施文档验证规则。

请参阅架构 schema-validation

文档结构

mongodb 应用程序设计数据模型的关键决策围绕文档的结构以及应用程序如何表示数据之间的关系展开。

mongodb 允许将相关数据嵌入到单个文档中。

嵌入式数据

嵌入式文档通过将相关数据存储在单个文档结构中来捕获数据之间的关系。

mongodb 文档使文档结构能够嵌入到文档中的字段或数组中。

这些非规范化数据模型允许应用程序在单个数据库操作中检索和操作相关数据。

data-model-denormalized.bakedsvg.svg

对于 mongodb 中的许多用例, 非规范化数据模型是最佳的。

有关嵌入文档的优点和缺点, 请参阅嵌入式数据模型。

引用

引用通过包括从一个文档到另一个文档的链接或引用来存储数据之间的关系。

应用程序可以解析这些引用以访问相关数据。

从广义上讲, 这些都是规范化的数据模型。

data-model-normalized.bakedsvg.svg

有关使用引用的优点和缺点, 请参阅规范化数据模型。

写入操作的原子性

单个文档原子性

在 mongodb 中, 写入操作在单个文档的级别上是原子操作, 即使该操作修改单个文档中的多个嵌入文档也是如此。

具有嵌入数据的非规范化数据模型将所有相关数据合并到一个文档中, 而不是跨多个文档和集合进行规范化。此数据模型促进了原子操作。

当单个写入操作 (例如 db.collection.updateMany()) 修改多个文档时, 每个文档的修改都是原子的, 但整个操作不是原子的。

执行多文档写入操作时, 无论是通过单个写入操作还是多个写入操作, 其他操作都可能会交织在一起。

从4.0 版开始, 对于需要对多个文档进行原子性或读取多个文档之间的一致性的情况, mongodb 为副本集提供多文档事务。

多文档事务

从4.0 版开始, 对于需要对多个文档进行原子性或读取多个文档之间的一致性的情况, mongodb 为副本集提供多文档事务。

重要

在大多数情况下, 多文档事务比单个文档写入带来更高的性能成本, 多文档事务的可用性不应取代有效的架构设计。

在许多情况下, 非规范化数据模型 (嵌入式文档和数组) 将继续是数据和用例的最佳选择。

也就是说, 在许多情况下, 适当地建模数据将最大限度地减少对多文档事务的需求。

数据使用和性能

设计数据模型时, 请考虑应用程序将如何使用数据库。

例如, 如果您的应用程序仅使用最近插入的文档, 请考虑使用 “已缓存集合”。

或者, 如果应用程序的需求主要是对集合的读取操作, 则添加索引以支持常见查询可以提高性能。

有关影响数据模型设计的这些注意事项和其他操作注意事项的详细信息, 请参阅操作因素和数据模型。

文档增长和 mmapv1

某些更新 (如将元素推送到数组或添加新字段) 会增加文档的大小。

对于弃用的 mmapv1 存储引擎, 如果文档大小超过该文档的分配空间, mongodb 将在磁盘上重新定位文档。

使用不推荐使用的 mmapv1 存储引擎时, 增长考虑可能会影响规范化或非规范化数据的决定。

有关 mmapv1 文档增长的规划和管理的详细信息, 请参阅文档增长注意事项。

参考资料

https://docs.mongodb.com/manual/core/map-reduce/