介绍
使用MongoDB设计数据库,就不要按照关系型数据库的思维来做,如范式化数据。因为MongoDB不支持服务端的join查询。一般来说,在对于顶端的对象都要用单独的collection进行存储。
当然不需要望每个对象都要创建一个collection。可替代的策略是使用嵌入对象(embed object)。
例子,在下面的图,有两个collection。
分别是student和courses。
student document嵌入了address对象并和score document。并且有个引用到courses。
相比较关系模型,一般会把score单独存储到一张表中并且有个外键关联到student。
Embed vs. Reference(内嵌VS引用)
MongoDB模型设计关键问题在于是单独创建collection,还是作为内嵌对象?
在关系型数据库中,每个子元素都要单独创建一张表。 在MongoDB中,这并不推荐。
内嵌对象性能要更为高效。 数据分配在了硬盘上; 客户端和服务器通信的消耗基本不存在。
因此 "为什么我不需要内嵌对象?"
为什么引用非常慢?让我们考虑这个student的例子。如果我们有个student对象并执行
print( student.address.city );
这个操作用内嵌对象的话会非常快速并且如果student在RAM中,这个内嵌对象同样也在RAM中。
print( student.scores[0].for_course.name );
如果是第一次访问course。shell或者驱动必须执行下列查询。
// 伪代码!
student.scores[0].for_course = db.courses.findOne({_id:_course_id_to_find_});
每个引用遍历都对于数据库是一个查询。 这个collection在_id上有个索引。
这个查询还是非常快的。然而, 即使所有的数据在RAM中,从应用服务器到数据库之间的通信也会有延迟。
一般来说,期望在RAM中1ms命中缓存。如果我们循环1000个student,查询每个student应用就会很慢了。
超过1分钟。 然而, 如果我们紧紧需要查询一个单独的元素,时间就是1ms 并且页面读取是完全可以接受的。
(注意如果在db缓存中, 返回1000student实际时间要小于1分钟)
下面是一些使用内嵌对象和引用的规则:
- 上层的对象。一般都是独立的collection。
- 对象详细的线性元素一般用于内嵌。
- 如果对象和对象的关系是包含关系,应该用内嵌。
- 多对多关系用引用。
- Collection存入的对象较少比较适合做独立的collection。
- 这样整个collection可以快速缓存应用服务器的内存中。
- 内嵌对象更难关联它上层的对象。还不能使用DBRef用在内嵌对象上。
- 要获取内嵌对象系统级别的视图更为困难。例子, 如果score不是内嵌,
- 就更容易查询所有学生中中,100个高分数。
- 如果内嵌对象很大(许多M), 你可能会遇到单个document容量的限制。
- 如果性能是个问题,那么就用内嵌。
示例
让我们看看一些示例
- Customer / Order / Order Line-Item
-
orders 应该是一个collection。 customers 是一个 collection.
- line-items 应该是order的一个内嵌数组对象。
- Blogging system.
-
posts 应该是一个 collection. post author 可以是一个 独立的 collection,
- 或者如果仅仅是一个email地址,可以作为posts的字段。comments 应该是posts中的内嵌对象。
索引的选择
第二个比较重要的是索引的选择. 作为通用规则,如果在关系型数据库需要添加索引,那么MongoDB也一样。
-
_id 字段自动索引。
- 查询的字段应该索引。
- 排序字段需要索引。
MongoDB profiling facility 提供了你应该添加索引的信息。
注意的是,添加索引会降低写入速度,对于读取频率高的collection可以创建多点的索引。
写频率较高的话,索引开销就很昂贵。
相关推荐
The Little MongoDB Schema Design Book, covers the fundamentals off Schema design with MongoDB, as well as several useful Schema design patters for your applications. I wrote this book to be a helpful...
通过阅读《MongoDB应用设计模式:MongoDB Applied Design Patterns》,开发者可以深入了解MongoDB的设计原则、最佳实践以及在实际项目中的应用,从而更好地利用这一强大的数据库系统。书中的案例和经验分享将帮助...
"MongoDB 数据库设计规范" MongoDB 数据库设计规范是 MongoDB 数据库的设计和实现的重要指南。该规范旨在提供一个全面的 MongoDB 数据库设计指南,涵盖了 MongoDB 的核心优势、BSON 的优化、架构设计、适用场景、...
mysql、redis和MongoDB三大数据库的优点和区别
MongoDB是一种流行的NoSQL数据库,它提供了一种灵活的数据模型,支持多种设计模式,非常适合处理大规模数据集,并能够应对高并发读写需求。这本书名为《MongoDB Applied Design Patterns》,由Rick Copeland撰写,...
《MongoDB Applied Design Patterns》是一本专为MongoDB设计模式应用而编写的经典教程,适合对数据库技术感兴趣的初学者及有经验的开发者。MongoDB是一款流行的NoSQL数据库系统,以其高性能、灵活性和易于扩展性而受...
mongodb集群数据库设计方案
什么是 MongoDB MongoDB 简介 MongoDB 特点 安装与配置 安装 MongoDB 启动与配置 MongoDB 基本操作 数据库和集合 文档操作 查询操作 基本查询 高级查询 索引与性能优化 创建索引 索引类型 索引优化 聚合操作 聚合...
MongoDB是NoSQL数据库的典型代表之一,它是一个面向文档的数据库,提供了高性能、高可用性和易扩展性。MongoDB支持丰富的查询语言,具有动态模式的特点,可以在文档中存储任意的数据类型,非常适合处理大规模的结构...
MongoDB和Redis是两种非常流行的...通过这些文档,你将掌握如何安装配置数据库,如何进行数据操作,如何设计合适的数据库架构,以及如何优化性能等关键技能。这对于提升你的IT专业素养和解决实际问题的能力大有裨益。
MongoDB 的设计目标是提供高性能、高可用性和可扩展性,使其成为大数据处理和分布式应用程序的理想选择。 在NoSQL数据库中,MongoDB以其灵活性和强大的功能脱颖而出。与传统的SQL数据库不同,MongoDB不依赖于固定的...
6. 动态Schema:与传统关系型数据库不同,MongoDB允许文档有不同的Schema,灵活适应变化的数据模型。 7. 高性能:MongoDB采用内存映射技术,使得读写速度非常快。同时,其BSON(Binary JSON)数据格式比纯文本JSON...
MongoDB是一款流行且功能强大的NoSQL数据库系统,以其灵活性、高性能和易扩展性而闻名。在处理非结构化或半结构化数据时,MongoDB是一个非常理想的选择。然而,对于那些不太熟悉命令行操作或者想要更直观管理数据库...
NOSQL数据库入门到实战: 结合实践案例,以任务为驱动,对Mongodb、Redis数据库技术进行梳理,让开发者快速掌握Mongodb和Redis数据库。Mongodb主要由文档(Document)、集合(Collection)、数据库(Database)三部分...
MongoDB是一种分布式文档型数据库,它属于NoSQL数据库的一种,以JSON格式的文档作为数据存储方式,具有高性能、高可用性和可扩展性。MongoDB以其灵活性、易用性以及对大数据处理的良好支持,在现代Web应用和云计算...
从给定的文件信息中,我们可以提炼出关于MongoDB架构设计基础的重要知识点,涉及数据建模的历史、目的、以及在MongoDB中实现这些设计的具体方法。 ### 数据建模简史 数据建模的历史源远流长,从最早的ISAM...
### MongoDB数据库设计与NoSQL概念解析 #### 一、引言 MongoDB作为一种流行的NoSQL数据库,因其灵活性、可扩展性和高性能等特点,在处理大规模数据存储和检索方面表现出色。本文将以一个假想的Web应用程序...
MongoDB是一款流行且功能强大的非关系型数据库系统,它以其灵活的数据模型、高可用性和可扩展性而受到广泛赞誉。本教程将引导你完成MongoDB的安装过程,并介绍其基本使用方法,适合在线教育初学者。 一、MongoDB...
MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和可扩展性而备受开发者青睐。作为NoSQL数据库的一种,MongoDB不采用传统...在实际应用中,合理的设计和优化策略对于充分利用MongoDB的优势至关重要。