认识了解MongoDB
原文地址:http://t.cn/AiOcP9Cy
向原作者致敬,写的如此详细且细致,这里认真拜读且有所改动。
# 1,数据库管理系统
在了解 MongoDB 之前需要先了解先数据库管理系统
# 1,什么是数据?
数据(英语:data),是指未经过处理的原始记录。
一般而言,数据缺乏组织及分类,无法明确的表达事物代表的意义,它可能是一堆的杂志、一大叠的报纸、数种的开会记录或是整本病人的病历纪录。数据描述事物的符号记录,是可定义为意义的实体,涉及事物的存在形式。是关于事件之一组离散且客观的事实描述,是构成讯息和知识的原始材料。
# 2,什么是数据库管理系统?
数据库管理系统(英语:database management system,缩写:DBMS
) 是一种针对对象数据库,为管理数据库而设计的大型电脑软件管理系统。
具有代表性的数据管理系统有:Oracle
、Microsoft SQL Server
、Access
、MySQL
及 PostgreSQL
等。通常数据库管理师会使用数据库管理系统来创建数据库系统。
现代 DBMS 使用不同的数据库模型追踪实体、属性和关系。在个人电脑、大型计算机和主机上应用最广泛的数据库管理系统是关系型 DBMS(relational DBMS)。在关系型数据模型中,用二维表格表示数据库中的数据。这些表格称为关系。
数据库管理系统主要分为俩大类:RDBMS、NOSQL
关于 RDBMS 的更多信息参考:http://www.cnblogs.com/clsn/category/1131345.html
# 3,常见数据库管理系统?
常见的数据库管理系统,及其排名情况如下:
- 图:数据库管理系统使用情况世界排名
- 数据来源:https://db-engines.com/en/ranking
# 2,NoSQL 是什么?
# 1,NoSQL 简介
NoSQL 是对不同于传统的关系数据库的数据库管理系统的统称。
两者存在许多显著的不同点,其中最重要的是 NoSQL 不使用 SQL 作为查询语言。其数据存储可以不需要固定的表格模式,也经常会避免使用 SQL 的 JOIN 操作,一般有水平可扩展性的特征。
NoSQL 一词最早出现于 1998 年,是 Carlo Strozzi 开发的一个轻量、开源、不提供 SQL 功能的关系数据库。
2009 年,Last.fm 的 Johan Oskarsson 发起了一次关于分布式开源数据库的讨论,来自 Rackspace 的 Eric Evans 再次提出了 NoSQL 的概念,这时的 NoSQL 主要指非关系型、分布式、不提供 ACID 的数据库设计模式。
2009 年在亚特兰大举行的 “no:sql(east)” 讨论会是一个里程碑,其口号是 “select fun, profit from real_world where relational=false;”。因此,对 NoSQL 最普遍的解释是 “非关联型的”,强调 Key-Value Stores 和文档数据库的优点,而不是单纯的反对 RDBMS。
基于 2014 年的收入,NoSQL 市场领先企业是 MarkLogic,MongoDB 和 Datastax。基于 2015 年的人气排名,最受欢迎的 NoSQL 数据库是 MongoDB,Apache Cassandra 和 Redis.
# 2,NoSQL 数据库四大家族
NoSQL 中的四大家族主要是:列存储、键值、图像存储、文档存储,其类型产品主要有以下这些。
# 3,NoSQL 的优势
高可扩展性、分布式计算、没有复杂的关系、低成本
架构灵活、半结构化数据
# 4,NoSQL 与 RDBMS 对比
- NoSQL
- 代表着不仅仅是 SQL
- 没有声明性查询语言
- 没有预定义的模式
- 键 – 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非 ACID 属性
- 非结构化和不可预知的数据
- CAP 定理
- 高性能,高可用性和可伸缩性
- RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL) (SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
# 3,MongoDB 简介
# 1,MongoDB 是什么
MongoDB 并非芒果的意思,而是源于 Humongous(巨大)一词。
# 2,MongoDB 的特性
MongoDB 的 3 大技术特色如下所示:
除了上图所示的还支持:
二级索引、动态查询、全文搜索 、聚合框架、MapReduce、GridFS、地理位置索引、内存引擎 、地理分布等一系列的强大功能。
但是其也有些许的缺点,例如:
- 多表关联: 仅仅支持 Left Outer Join
- SQL 语句支持: 查询为主,部分支持
- 多表原子事务: 不支持
- 多文档原子事务:不支持
- 16MB 文档大小限制,不支持中文排序 ,服务端 Javascript 性能欠佳
# 3,关系型数据库与 mongodb 对比
存储方式对比
在传统的关系型数据库中,存储方式是以表的形式存放,而在 MongoDB 中,以文档的形式存在。
数据库中的对应关系,及存储形式的说明
MongoDB 与 SQL 的结构对比详解
SQL Terms/Concepts | MongoDB Terms/Concepts |
---|---|
database | database |
table | collection |
row | document or BSON document |
column | field |
index | index |
table joins | embedded documents and linking |
primary keySpecify any unique column orcolumn combination asprimary key. | primary keyIn MongoDB, the primary key isautomatically set to the _id field. |
aggregation (e.g. group by) | aggregation pipelineSee the SQL to Aggregation MappingChart. |
# 4,MongoDB 数据存储格式
- JSON 格式
JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。
MongoDB 使用 JSON(JavaScript ObjectNotation)文档存储记录。
JSON 数据库语句可以容易被解析。
Web 应用大量使用,NAME-VALUE 配对
- BSON 格式
BSON 是由 10gen 开发的一个数据格式,目前主要用于 MongoDB 中,是 MongoDB 的数据存储格式。BSON 基于 JSON 格式,选择 JSON 进行改造的原因主要是 JSON 的通用性及 JSON 的 schemaless 的特性。
二进制的 JSON,JSON 文档的二进制编码存储格式
BSON 有 JSON 没有的 Date 和 BinData
MongoDB 中 document 以 BSON 形式存放
例如:
> db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});
# 5,MongoDB 的优势
MongoDB 是开源产品
On GitHub Url:https://github.com/mongodb
Licensed under the AGPL,有开源的社区版本
起源 & 赞助 by MongoDB 公司,提供商业版 licenses 许可
这些优势造就了 mongodb 的丰富的功能:
JSON 文档模型、动态的数据模式、二级索引强大、查询功能、自动分片、水平扩展、自动复制、高可用、文本搜索、企业级安全、聚合框架 MapReduce、大文件存储 GridFS
# 6,高可用的复制集群
自动复制和故障切换
多数据中心支持滚动维护无需关机支持最多 50 个成员
# 7,水平扩展
这种方式是目前构架上的主流形式,指的是通过增加服务器数量来对系统扩容。在这样的构架下,单台服务器的配置并不会很高,可能是配置比较低、很廉价的 PC,每台机器承载着系统的一个子集,所有机器服务器组成的集群会比单体服务器提供更强大、高效的系统容载量。
这样的问题是系统构架会比单体服务器复杂,搭建、维护都要求更高的技术背景。分片集群架构如下图所示:
# 8,各存储引擎的对比
MySQL InnoDB | MySQL NDB | Oracle | MongoDB MAPI | MongoDB WiredTiger | |
---|---|---|---|---|---|
事务 | YES | YES | ES | NO | NO |
锁粒度 | ROW-level | ROW-level | ROW-level | Collection-level | Document-level |
Geospatial | YES | YES | YES | YES | YES |
MVCC | YES | NO | YES | NO | NO |
Replication | YES | YES | YES | YES | YES |
外键 | YES | YES(From 7.3) | YES | NO | NO |
数据库集群 | NO | YES | YES | YES | YES |
B-TREE 索引 | YES | YES | YES | YES | YES |
全文检索 | YES | NO | YES | YES | YES |
数据压缩 | YES | NO | YES | NO | YES |
存储限制 | 64TB | 384EB | NO | NO | NO |
表分区 | YES | YES | YES | YES (分片) | YES (分片) |
# 9,数据库功能和性能对比
由下图可以看出 MongoDB 数据库的性能扩展能力及功能都较好,都能够在数据库中,站立一足之地。
# 10,MongoDB 适用场景
网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及 JSON 数据的存储。
# 11,MongoDB 慎用场景
慎用场景 | 原因 |
---|---|
PB 数据持久存储大数据分析数据湖 | Hadoop、Spark 提供更多分析运算功能和工具,并行计算能力更强 MongoDB + Hadoop/Spark |
搜索场景:文档有几十个字段,需要按照任意字段搜索并排序限制等 | 不建索引查询太慢,索引太多影响写入及更新操作 |
ERP、CRM 或者类似复杂应用,几十上百个对象互相关联 | 关联支持较弱,事务较弱 |
需要参与远程事务,或者需要跨表,跨文档原子性更新的 | MongoDB 事务支持仅限于本机的单文档事务 |
100% 写可用:任何时间写入不能停 | MongoDB 换主节点时候会有短暂的不可写设计所限 |
# 12,什么时候该 MongDB
应用特征 | Yes/No? |
---|---|
我的数据量是有亿万级或者需要不断扩容 | |
需要 2000-3000 以上的读写每秒 | |
新应用,需求会变,数据模型无法确定 | |
我需要整合多个外部数据源 | |
我的系统需要 99.999% 高可用 | |
我的系统需要大量的地理位置查询 | |
我的系统需要提供最小的 latency | |
我要管理的主要数据对象 <10 |
在上面的表格中进行选择,但有 1 个 yes 的时候:可以考虑 MongoDB;当有 2 个以上 yes 的时候:不会后悔的选择!