体系和架构
# MongoDB体系结构
MongoDB的体系结构如下所示:磁盘文件经过加载之后后形成 MongoDB 实例,一个 MongoDB 实例中可以存放多个数据库(图中的MongoDB 数据库1、MongoDB 数据库2、MongoDB 数据库3),数据库中存放的是一个个 Collection (集合,对应关系型数据库的 table),集合中又存放 Document (文档,对应关系型的记录),Document 中存放 Field(字段,对应关系型数据库列)。
和传统数据库进行对比
RDBMS | MongoDB |
---|---|
database(数据库) | database(数据库) |
table (表) | collection( 集合) |
row( 行) | document( BSON 文档) |
column (列) | field (字段) |
index(唯一索引、主键索引) | index (支持地理位置索引、全文索引 、哈希索引) |
join (主外键关联) | embedded Document (嵌套文档) |
primary key(指定1至N个列做主键) | primary key (指定_id field做为主键) |
# BSON
BSON(Binary JSON)是一种二进制存储 JSON 的格式,支持内嵌文档对象和数组对象,BSON 有 JSON 没有的一些数据类型,如 Date 和 Binary Data 类型。BSON 是一种 schema-less(格式自由)的存储形式,可以用作网络数据交换,它的优点是灵活性高,它的缺点是空间利用率低。例如:{key:value,key2:value2}
,其中 key 是字符串类型,后面的 value 值。BSON 有三个特点:轻量性、可遍历性、高效性。
MongoDB可以存储的数据类型有下面这几种
# MongoDB架构
MongoDB 与 MySQL 中的架构相差不多,底层都使用了可插拔的存储引擎以满足用户的不同需要。用户可以根据程序的数据特征选择不同的存储引擎,在最新版本的 MongoDB 中使用了 WiredTiger 作为默认的存储引擎,WiredTiger 提供了不同粒度的并发控制和压缩机制,能够为不同种类的应用提供了最好的性能和存储率;在存储引擎上层的就是 MongoDB 的数据模型和前面提到的查询语言了,由于 MongoDB 对数据的存储与 RDBMS 有较大的差异,所以它创建了一套不同的数据模型和查询语言;
# 数据模型
MongoDB中数据表示方式有内嵌和引用两种,这两个其实就是不同的表示方式
“引用”我们比较好理解,是指将不同实体的数据分散不到不同的集合中,而在关系型数据库 (opens new window)设计中就是将实体分别建立相应的模型表。如常见的“老师-学生”,“产品-标签”关系,只要实体间存在关系,就可以使用“引用”思想。
“内嵌”是一种反范式化的设计,指的是将每个文档所需的数据都嵌入到文档内部,我想举一个“用户-账户”的关系。我们知道在领域驱动设计中,“用户”是一个聚合根,每个用户对应一个账户,所以是“1对1”的一种关系,在关系型数据库设计中,大部分时候都会将这两者严格区分开来。但是在MongoDB中,却不然,我们可以直接选择将“用户”需要的“账户”数据内嵌到用户文档中,便于我们的增删改查。这是一种反范式化的设计。
内嵌和引用的效果
- 数据对象之间有包含关系 ,一般是数据对象之间有一对多或者一对一的关系;
- 需要经常一起读取的数据;
- 有 map-reduce/aggregation 需求的数据放在一起,这些操作都只能操作单个 collection;
引用:
- 当内嵌数据会导致很多数据的重复,并且读性能的优势又不足于覆盖数据重复的弊端;
- 需要表达比较复杂的多对多关系的时候;
- 大型层次结果数据集嵌套不要太深;
存储引擎会在存储引擎那个章节单独说明