【1】MongoDB简介
(1.1)什么是MongoDB
MongoDB是一个文档数据库(以Json 为数据模型),由 C++语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案;
MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,数据格式是 BSON(一种类似于 JSON 的二进制形式的存储格式,简称binary Json,比起JSON多了一些元数据),和 JSON 一样支持内嵌的文档对象和数组对象,因此可以存储比较复杂的数据类型。
MongoDB 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
原则上 Oracle 和 Mysql 能做的事情,MongoDB都能做(包括 ACID 事务)。
4.2之后,支持了跨分片多文档事务(分布式事务);
如:一个事务写了3个文档,分别想到3个不同分片 A B C,如何保证全部正常或者全部失败;
(1.2)MongoDB与关系型数据库的概念对比
数据库(database):最外层的概念,可以理解为逻辑上的名称空间,一个数据库包含多个不同名称的集合;
集合(collection):相当于 SQL 中的表,一个集合可以存放多个不同的文档;
文档(document):一个文档相当于数据表中的一行,由多个不同的字段组成;
字段(field):文档中的一个属性,等同于关系型数据库中的列(column)
索引(index):独立的检索式数据结构,与SQL 的概念一致。
_id:每个文档中都有一个唯一的 _id 字段,相当于SQL 中的主键(primary key)
视图(view):可以看做一种虚拟的集合,与 SQL 中的视图类似。从MongoDB 3.4版本开始提供了视图功能,其可以通过聚合管道技术实现;
聚合操作($lookup):MongoDB 用于实现 “类似” 表连接(table join) 的聚合操作符
内容对比:
尽管这些概念大多与 SQL 标准定义类似,但 MongoDb 与传统 RDBMS 仍然存在不少差异,包括如下:
半结构化:
在一个集合中,文档所拥有的字段并不是需要是相同的,而且也不需要对所用的字段进行生命。因此,MongoDB 具有很明显的半结构化特点
除了松散的表结构,文档还可以支持多级的嵌套、数组等灵活的数据类型,非常契合面向对象的变成模型。
弱关系:
MongoDB 没有外键的约束,也没有很强大的表连接能力。类似的功能需要使用聚合管道技术来弥补;
【2】MongoDB技术优势
MongoDB基于灵活的 Json 文档模型,非常适合敏捷式的快速开发。
与此同时具有与生俱来的高可用、高水平扩展能力;使得它在处理海量数据、高并发的情况时具有一定优势;
- Json 结构的对象模型接近,开发代码量低
- Json的动态模型意味着更容易响应新的业务需求
- 复制集提供99.999%高可用
- 分片架构支持海量数据和无缝扩容
(2.1)解决关系型数据库的复杂关联(简单直观)
如下图,复杂的关系型表 =》 变成了 Json 文档组织
(2.2)文档模型包含了各种类型(快速的开发)
如下图,比如有多个邮件、有多个 interests 兴趣爱好,可以用数组组成;
如果是关系型数据库,可能需要可能多表构建,然后多个兴趣爱好时需要多行存储;
(2.3)无感的在线加字段(灵活解决业务变化)
如果我们要加字段,加数据对于关系型数据库来说,大表加字段简直是一种灾难;
但如果用 Mongodb,如下图,我们直接可以在线无任何业务影响的加个社交字段;这里还可以用一个 version 字段来做好版本管理;
(2.4)集群-原生高可用
- Replica Set - 2 to 50 个成员
- 自动选举、恢复
- 多中心容灾能力
- 滚动服务 - 最小化服务终端
如下图
这里还可以延迟复制,比如延迟10分钟;以便解决误删、误操作等问题;
(2.5)集群-横向扩展节点能力
如下图,在应用访问过来后,由MongoOS(每个节点都有)根据元数据 config 信息,来找到请求对应要访问哪个分片;
如果是加一个节点,一个命令就可以了很方便;
【3】MongoDB 应用场景
(3.1)基本应用场景
(3.2)什么时候考虑用 MongoDB
如下列,有一点就可以考虑使用;