数据建模简介
数据建模的关键挑战是平衡应用程序的需求、数据库引擎的性能特征和数据检索模式。 在设计 Realm 数据模型时,请始终考虑数据的应用程序使用情况(即 数据的查询、更新和处理)以及数据本身的固有结构。
灵活模式
在SQL数据库中,必须在插入数据之前确定并声明表的模式,而 MongoDB 的集合则不同,默认不要求其文档具有相同的模式。 也就是说:
单个collection中的文档不需要具有相同的字段集,并且字段的数据类型可以因collection中的文档而异。
若要更改集合中文档的结构,例如添加新字段、删除现有字段或将字段值更改为新类型,请将文档更新为新结构。
这种灵活性有助于将文档映射到实体或对象。 每个文档都可以匹配所表示实体的数据字段,即使该文档与collection中的其他文档有很大差异。
但实际上,collection中的文档具有相似的结构,您可以在更新和插入操作期间为collection实施文档验证规则。有关详细信息,请参阅模式验证。
文档结构
为 MongoDB 应用程序设计 Realm 数据模型时,关键决策围绕文档结构以及应用程序如何表示数据之间的关系。MongoDB 允许将相关数据嵌入到单个文档中。
嵌入式数据
嵌入式文档通过在单个文档结构中存储相关数据来捕获数据之间的关系。 MongoDB 文档使得可以将嵌入式文档结构嵌入到文档的字段或数组中。这些非规范化Realm 数据模型允许应用程序在单个数据库操作中检索和操作相关数据。
对于 MongoDB 中的许多使用案例,非规范化数据模型是最佳选择。
有关嵌入文档的优缺点,请参阅Realm 数据模型。
参考
引用通过包含从一个文档到另一文档的链接或引用来存储数据之间的关系。 应用程序可以解析这些引用以访问相关数据。 从广义上讲,这些是规范化的Realm 数据模型。
有关使用引用的优缺点,请参阅规范化Realm 数据模型。
写入操作的原子性
单个文档原子性
在 MongoDB 中,写操作在单份文档级别上具有原子性,即使该操作修改单份文档内的多份嵌入式文档也是如此。
具有嵌入式数据的非规范化数据模型将所有相关数据组合在单个文档中,而不是跨多个文档和集合进行规范化。这种数据模型有助于实现原子操作。
有关 MongoDB 中事务的详细信息,请参阅事务页面。
多文档事务
当单个写入操作(例如 db.collection.updateMany()
)修改了多份文档,则每份文档的修改都是原子性的,但整个操作不是原子性的。
在执行多文档写入操作时,无论是通过单次写入操作还是多次写入操作,其他操作都可能会交错进行。
对于需要对多个文档(在单个或多个集合中)原子性读取和写入的情况,MongoDB 支持分布式事务,包括副本集和分片集群上的事务。
有关详细信息,请参阅事务。
重要
在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。
有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项。
数据使用和性能
设计Realm 数据模型时,请考虑应用程序将如何使用数据库。例如,如果您的应用程序仅使用最近插入的文档,请考虑使用固定大小集合。或者,如果您的应用程序主要需要对collection进行读取操作,则添加索引以支持常见查询可以提高性能。
有关影响Realm 数据模型设计的这些和其他操作注意事项的更多信息,请参阅操作因素和Realm 数据模型。
了解详情
MongoDB University
要学习;了解如何构建文档和定义模式,请参阅MongoDB University 的“数据建模”课程。
应用程序现代化指南
有关使用 MongoDB 进行数据建模的更多信息,请下载 MongoDB 应用程序现代化指南》。
下载内容包括以下资源:
介绍使用 MongoDB 进行数据建模的方法
白皮书介绍了从 RDBMS 数据模型迁移到 MongoDB 的最佳实践和注意事项
引用 MongoDB 模式及其 RDBMS 等效模式
应用程序现代化记分卡