1. NoSQL概况
NOSQL:(NoSQL全名:Not Only SQL,意思为“不仅仅是SQL”),NoSQL是对不同于传统关系数据库的数据库管理系统的统称。
从数据库的发展开始就有了NoSQL数据库,在上世纪90年代到2010年之间,世界上最流行的数据库依然是关系型数据库,并且围绕着关系型数据库开发出了大量的程序应用,又随着移动技术(云计算、大数据)的发展,很多公司不愿意去使用大型的厂商数据库 —— Oracle等,因为这些人已经习惯于使用MySQL数据库,这些人发现在大数据以及云计算的环境下,数据存储受到了很大的挑战,后来就开始重新进行了NoSQL数据库的开发,但是经过长期的开发发现NoSQL数据库依然不可能离开传统的关系型数据库。
2. MongoDB 简介
MongoDB 是一个基于分布式文件存储的NoSQL数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
传统的关系型数据库一定存放大量的冗余数据,导致查询效率降低,脏数据较多,不合理;而MongoDB 数据库中,可以直接在业务层中的数据(一般为JSON)交给NoSQL数据库保存,按照指定的结构(人为定义)进行存储。
MongoDB的核心竞争力在于:
- 基于 JSON 的数据模型最接近开发者的面向对象的设计思维;
- 灵活动态的模型意味着在需求多变的时候极大简化数据库设计流程;
- 自动分片、多节点自动同步和跨中心能力支持各种现代化复杂部署需求。
3. MongoDB 发展历史
2007年,MongoDB公司的前身10gen正式成立,2009年2月开源数据库MongoDB 1.0正式面世,以开源的方式进入市场接受考验。时至今日,MongoDB已经从一个在数据库领域籍籍无名的“小透明”,变成了话题度和热度都很高的主流数据库。
-
2009年2月,MongoDB数据库首次在数据库领域亮相,打破了关系型数据库一统天下的局面;
-
2014年12月, MongoDB 收购了WiredTiger 存储引擎,大幅提升了MongoDB的写入性能;
-
2016年, MongoDB推出Atlas,在AWS、 Azure 和GCP上的MongoDB托管服务;
-
2018年6月, MongoDB推出ACID事务支持,成为第一个支持强事务的NoSQL数据库;
-
2018年11月,MongoDB将其开源授权修改为SSPL。
4. MongoDB 特点
- 面向集合的存储过程,易存储对象类型的数据;
“面向集合”(Collenction-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定 义任何模式(schema)。
- 模式自由(无模式);
模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
-
方便的进行数据的存储扩充;
-
支持索引;
-
支持短暂数据保留;
-
具备完整的数据库状态监控;
-
支持Ruby,Python,Java,C++,PHP等多种语言;
-
基于BSON 应用(一种JSON的扩展);
BSON(Binary Serialized document Format)存储形式是指:存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。
- 可通过网络访问。
MongoDB 服务端可运行在 Linux、Windows或OS X 平台,支持 32 位和 64 位应用,默认端口为 27017。推荐运行在 64 位平台,因为 MongoDB 在 32 位模式运行时支持的最大文件尺寸为 2GB。
5. MongoDB 与其他类型数据库对比
5.1 NoSQL 之间的对比
NoSQL 数据库根据数据的存储模型和特点分为很多种类:
类型 | 部分代表 | 特点 |
---|---|---|
列存储 | Hbase、Cassandra、Hypertable | 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。 |
文档存储 | MongoDB CouchDB | 文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。 |
key-value存储 | Tokyo Cabinet / Tyrant Berkeley DB、MemcacheDB Redis | 可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能) |
图存储 | Neo4J、FlockDB、InfoGrid | 图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。 |
对象存储 | db4o、Versant | 通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。 |
xml数据库 | Berkeley DB XML BaseX | 高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。 |
5.2 MongoDB 与关系型数据库之间的对比
MongoDB 数据库与 MySQL 数据库(关系型数据库代表)有如下的概念定义:
No. | MySQL | MongoDB |
---|---|---|
1 | 数据库 | 数据库(类似于MySQL) |
2 | 表 | 集合 |
3 | 行 | 文档 |
4 | 列 | 成员 |
5 | 主键 | Object ID(自动维护) |
6. MongoDB 的主要版本
-
2012年05月23日,MongoDB 2.1 开发分支发布了! 该版本采用全新架构,包含诸多增强。
-
2012年06月06日,MongoDB 2.0.6 发布,分布式文档数据库。
-
2013年04月23日,MongoDB 2.4.3 发布,此版本包括了一些性能优化,功能增强以及bug修复。
-
2013年08月20日,MongoDB 2.4.6 发布。
-
2013年11月01日,MongoDB 2.4.8 发布。
-
2017年03月17日,MongoDB 3.0.1 发布。
-
2018年08月06日,MongoDB 4.0.2 发布,支持多文档事务。
-
2019年08月13日,MongoDB 4.2.0 发布 ,引入分布式事务。
7. MongoDB 业务场景
MongoDB 的实际业务场景有很多、比如:日志存储系统、缓存机制数据、数据分析系统等,以下主要为笔者所接触过的实际应用场景:
7.1 web 应用程序
Web 应用的业务特点是读写请求都比较高,数据存储需要适应业务的扩展。传统的关系型数据库表结构是固定的,增加一个业务或者业务变更,横向扩展都会给数据库带来很大的工作量。
MongoDB 支持无固定结果模型,很容易增加或减少字段。同时 MongoDB 支持分片集群,因此很容易实现水平扩展,将数据分散到集群的各个分片中。此外 MongoDB 支持热数据,它会维护一个工作集,通过内存映射数据文件,将最热的数据放在内存中。
7.2 缓存系统
与关系数据库搭配使用,作为关系型数据库的缓存前端。
7.3 日志分析系统
MongoDB 可以写入海量的日志数据,可以通过特有的 sql 语句快速找到某一条日志记录,还可以通过MapReduce 进行数据分析。
8. 课程简介
8.1 课程简介
- 实现MongoDB的简单环境搭建;
- 笔者带领各位伙伴完整MongoDB的增删改查操作;
- 了解MongoDB的索引、聚合等特性;
- 使用MongoDB官方提供Java客户端连接MongoDB进行操作;
- 使用Java语言实现业务日志在MongoDB的中存储。
8.2 适应人群
- 想在实际项目中使用MongoDB的开发人员
- 课程所需:计算机、大脑、想学习MongoDB的良好心态