原文:6 Rules of Thumb for MongoDB Schema Design: Part 1
By William Zola, Lead Technical Support Engineer at MongoDB
“我有丰富的sql使用经验,但是我是个MongoDB的初学者。我应该如何在MongoDB中针对一对多关系进行建模?”这是我被问及最多的问题之一。
我没法简单的给出答案,因为这有很多方案去实现。接下来我会教导你如何针对一对多进行建模。
这个话题有很多内容需要讨论,我会用三个部分进行说明。在第一部分,我会讨论针对一对多关系建模的三种基础方案。在第二部分我将会覆盖更多高级内容,包括反范式化和双向引用。在最后一部分,我将会回顾各种选择,并给出做决定时需要考虑的因素。
很多初学者认为在MongoDB中针对一对多建模唯一的方案就是在父文档中内嵌一个数组子文档,但是这是不准确的。因为你可以在MongoDB内嵌一个文档不代表你就必须这么做。
当你设计一个MongoDB数据库结构,你需要先问自己一个在使用关系型数据库时不会考虑的问题:这个关系中集合的大小是什么样的规模?你需要意识到一对很少,一对许多,一对非常多,这些细微的区别。不同的情况下你的建模也将不同。
Basics: Modeling One-to-Few
一对很少
针对个人需要保存多个地址进行建模的场景下使用内嵌文档是很合适,可以在person文档中嵌入addresses数组文档:
这种设计具有内嵌文档设计中所有的优缺点。最主要的优点就是不需要单独执行一条语句去获取内嵌的内容。最主要的缺点是你无法把这些内嵌文档当做单独的实体去访问。
例如,如果你是在对一个任务跟踪系统进行建模,每个用户将会被分配若干个任务。内嵌这些任务到用户文档在遇到“查询昨天所有的任务”这样的问题时将会非常困难。我会在下一篇文章针对这个用例提供一些适当的设计。
Basics: One-to-Many
一对许多
以产品零件订货系统为例。每个商品有数百个可替换的零件,但是不会超过数千个。这个用例很适合使用间接引用---将零件的objectid作为数组存放在商品文档中(在这个例子中的ObjectID我使用更加易读的2字节,现实世界中他们可能是由12个字节组成的)。
每个零件都将有他们自己的文档对象
每个产品的文档对象中parts数组中将会存放多个零件的ObjectID :
在获取特定产品中所有零件,需要一个应用层级别的join
为了能快速的执行查询,必须确保products.catalog_number有索引。当然由于零件中parts._id一定是有索引的,所以这也会很高效。
这种引用的方式是对内嵌优缺点的补充。每个零件是个单独的文档,可以很容易的独立去搜索和更新他们。需要一条单独的语句去获取零件的具体内容是使用这种建模方式需要考虑的一个问题(请仔细思考这个问题,在第二章反反范式化中,我们还会讨论这个问题)
这种建模方式中的零件部分可以被多个产品使用,所以在多对多时不需要一张单独的连接表。
Basics: One-to-Squillions
一对非常多
我们用一个收集各种机器日志的例子来讨论一对非常多的问题。由于每个mongodb的文档有16M的大小限制,所以即使你是存储ObjectID也是不够的。我们可以使用很经典的处理方法“父级引用”---用一个文档存储主机,在每个日志文档中保存这个主机的ObjectID。
以下是个和第二中方案稍微不同的应用级别的join用来查找一台主机最近5000条的日志信息
所以,即使这种简单的讨论也有能察觉出mongobd的建模和关系模型建模的不同之处。你必须要注意一下两个因素:
Will the entities on the “N” side of the One-to-N ever need to stand alone?
一对多中的多是否需要一个单独的实体。
What is the cardinality of the relationship: is it one-to-few; one-to-many; or one-to-squillions?
这个关系中集合的规模是一对很少,很多,还是非常多。
Based on these factors, you can pick one of the three basic One-to-N schema designs:
基于以上因素来决定采取一下三种建模的方式
一对很少且不需要单独访问内嵌内容的情况下可以使用内嵌多的一方。
一对多且多的一端内容因为各种理由需要单独存在的情况下可以通过数组的方式引用多的一方的。
一对非常多的情况下,请将一的那端引用嵌入进多的一端对象中。
下一次我们将会看到如何使用双向关系和反范式化去提升以上三种基本方案的性能
第二章
分享到:
相关推荐
mongodb集群数据库设计方案
"MongoDB 数据库设计规范" MongoDB 数据库设计规范是 MongoDB 数据库的设计和实现的重要指南。该规范旨在提供一个全面的 MongoDB 数据库设计指南,涵盖了 MongoDB 的核心优势、BSON 的优化、架构设计、适用场景、...
MongoDB是一种通用、基于文档的分布式数据库,专为现代应用程序开发者和云时代设计。它以其高效性和生产力而闻名,尤其适合处理JSON格式的数据。JSON-like文档的存储方式使得MongoDB比传统的行/列模型更为表达性和...
MongoDB 的弹性数据库设计是为了解决系统停机问题,保证高可用性和数据一致性,同时适应不断变化的业务需求。 首先,eBay 使用 MongoDB 的副本集功能来实现高可用性。副本集是一种容错机制,它允许数据在多个节点间...
MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和可扩展性而备受开发者青睐。作为NoSQL数据库的一种,MongoDB不采用传统...在实际应用中,合理的设计和优化策略对于充分利用MongoDB的优势至关重要。
在本文中,我们将深入探讨如何在Laravel框架中使用MongoDB数据库驱动,让Laravel的Eloquent ORM(对象关系映射)支持非关系型数据库。标题"laravel-mongodb"表明我们将关注的是将MongoDB集成到Laravel项目中的技术...
MongoDB数据库管理工具则是为了帮助用户更有效地管理和操作MongoDB数据库而设计的软件。MongoVUE是其中的一款常用工具,它提供了直观的图形用户界面(GUI),使得数据库的管理和维护变得更加便捷。 MongoDB的核心...
### MongoDB数据库设计与NoSQL概念解析 #### 一、引言 MongoDB作为一种流行的NoSQL数据库,因其灵活性、可扩展性和高性能等特点,在处理大规模数据存储和检索方面表现出色。本文将以一个假想的Web应用程序...
相比于传统的关系型数据库,MongoDB避免了复杂的多表关联,可以在单一文档中存储完整的业务数据,如电影、影评和影评回复,大大减少了数据模型设计的复杂性。 MongoDB的安装过程相对简单,主要步骤包括下载最新稳定...
6. **开发流程**:后端开发通常涉及需求分析、数据库设计、API接口规划、编码实现、测试和部署。在这个项目中,开发者可能首先定义了斗鱼弹幕的模型,然后在MongoDB中创建对应的集合,接着使用Node.js实现弹幕的接收...
这个“mongodb数据库demo”将帮助初学者快速上手MongoDB,通过SpringMongoDB的实践,理解如何在实际项目中集成和操作MongoDB数据库,为后续的开发工作打下坚实基础。通过深入研究和实践,你将能够熟练地利用MongoDB...
基于MongoDB的数据库高可用高性能研究(毕业论文).caj
"MongoDB数据库WEB远程维护管理软件"是专为MongoDB设计的一款基于Web界面的管理工具,允许用户通过网络远程对MongoDB数据库进行操作和维护,极大地提高了数据库管理的便捷性和效率。 在数据库管理领域,可视化工具...
这种设计使得MongoDB在处理非结构化和半结构化数据时表现出色。 MongoDB的核心特点包括: 1. **文档存储**:MongoDB中的数据以文档的形式存储,这些文档是键值对的集合,类似于JSON对象。这使得数据模型更加自然,...
总之,这个“mongodb数据库jar包”是Java开发者与MongoDB数据库交互的基础工具,它涵盖了所有必要的API和功能,使开发人员能够充分利用MongoDB的强大功能。通过熟练掌握Java MongoDB驱动,你可以构建高效、可扩展的...
该项目是基于Java语言的MongoDB数据库服务端设计源码,包含69个文件,涵盖54个XML配置文件、5个Java源文件、5个Class文件、2个YAML配置文件、1个Git忽略文件、1个项目名称文件、1个IntelliJ IDEA模块文件。...
数据库课程设计 基于MongoDB数据库的机务维修管理系统源码+详细说明+全部数据资料 高分项目.zip 【备注】 1、该项目是高分课程设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过...
- **故障容忍能力**:采用分布式存储和计算分离的设计,能够容忍N-1个节点故障,相比自建MongoDB,具有更高的系统可用性。 2. **更高性价比**: - **读写性能提升**:在同等成本下,华为云DDS服务提供3倍于自建...
该项目为基于Java语言的MongoDB数据库应用设计源码,包含31个文件,涵盖10个Java源代码文件、8个XML配置文件、4个YAML文件、2个Git忽略规则文件、2个Idea项目配置文件、2个PDF文档、1个许可证文件、1个tar.gz压缩包...
查看数据库,使用以下命令: ``` show dbs ``` 六、设置远程访问 为了允许远程访问 MongoDB,我们需要编辑 `/etc/mongod.conf` 文件,注释掉 `bindIp` 行,并重启 MongoDB。 七、高级查询 MongoDB 提供了多种高级...