MongoDB简介

MongoDB介绍

MongoDB是一个开源文档数据库,提供高性能,高可用性和自动扩展。

文件数据库

MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。

MongoDB文档。

使用文档的好处是:

  • 文档(即对象)对应于许多编程语言中的本机数据类型。
  • 嵌入式文档和数组减少了对昂贵连接的需求。
  • 动态模式支持流畅的多态性。

主要特点

高性能

MongoDB提供高性能数据持久性。特别是,

  • 对嵌入式数据模型的支持减少了数据库系统的I / O活动。
  • 索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。

丰富的查询语言

MongoDB支持丰富的查询语言以支持读写操作(CRUD)以及:

高可用性

MongoDB的复制工具称为副本集,它提供:

  • 自动故障转移和
  • 数据冗余。

副本集是一组保持相同的数据集,从而提供冗余和提高数据可用性的MongoDB服务器。

水平可伸缩性

MongoDB提供水平可伸缩性作为其核心 功能的一部分

  • 分片在一组计算机集群分布数据。
  • 从3.4开始,MongoDB支持基于分片创建数据区域在平衡群集中,MongoDB仅将区域覆盖的读取和写入指向区域内的分片。有关 更多信息,请参阅Zones手册页。

支持多存储引擎

MongoDB支持多个存储引擎

此外,MongoDB提供可插拔存储引擎API,允许第三方为MongoDB开发存储引擎。

以MongoDB为例与关系型数据库比较

数据库事物:

一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理

由此再简要说明一下ACID

Atomic:原子性,无论包含多少操作,事务是一个不可分割的整体
Consistency:一致性,每个事务必须保证数据之间存在的各种关系和约束
Isolation:隔离性,事务之间的操作是相互独立的,互相之间没有交叉。(影响数据库性能的关键)
Duration:持久性,事务完成后对于系统的影响是永恒的,不会随时间而改变
有了数据库事务的概念后,我们再来看MongoDB(同时代表大部分NoSql,下文不再重述)和MySql(代表大部分关系型数据库,下文不再重述)的区别,分为三部分。

1 存储结构


数据库 MongoDB MySQL
第一层 Collection Table
第二层 document row
结构固定 否 是
预先定义表结构 否 是
允许存储列表 是 否
允许嵌套 document可以嵌套 否
MongoDB主要以键值对的形式存储,随时可以以任意形式插入,且document可以嵌套,所以在数据的存取和查询上相当灵活、高效。但同时由于形式不严谨,对于有一定逻辑的操作,不容易实现。
相比较之下,mysql虽然不那么灵活,但结构严谨,能实现较为复杂的关系和业务。

2 数据库事务


数据库事务原本就是关系型数据库中发展出来的概念,所以MySQL肯定全部满足。而MongoDB是不支持事务的(这也是其灵活的关键),但对于事务中的ACID值得讨论。

原子性:mongodb对于document的基本操作是满足原子性的,对于较为复杂的集合操作(同时又很多操作)也提供了很多函数确保原子性。
一致性:MongoDB是很难满足数据的一致性的(虽然有Read Concern和Write Concern),尤其对于分布式数据库,根据CAP理论,MongoDB在损失了一致性的同时,有一定的分区容错性。这种情况对于并发性不是很高,逻辑不是很严谨的系统是合适的,如果有某些业务需要保证较高的一致性,MongoDB可以借用锁实现。
隔离性:由于隔离性的实现代价较高,对于性能的影响较大,并且MongoDB保证了原子性,所以对于大部分情况,是不保证隔离性的,即事务之间有交叉,但原子操作之间是没有的。
持久性:满足,基本上对于所有的数据库都是满足持久性的吧,除了内存数据库。
还有很重要的一点是数据的完整性。包括实体完整性,引用完整性,用户自定义完整性。MongoDB是可以实现实体完整性的,引用完整性可以用DBRef实现。用户自定义完整性,既然是自定义肯定就有很多实现和方法,MongoDB自带的用户自定义完整性肯定是没有MySQL丰富和方便的。

3 性能及应用场景


由以上可以得到各自的显著特点:
MongoDB:存取灵活,弱结构,键值对(JSON)形式适合很多应用场景。
MySQL:结构严谨,逻辑严密,有完整的数学理论支持。

应用场景:
MongoDB:
1. 弱结构很适合第三方信息的抓取,不需要为各种来源设计表结构,直接存储,极大的减少了数据库设计维护的工作量。
2. 存取灵活适合于一些随时存取,结构化要求又不高的业务场景,比如日志文件、数据分析处理等
3. 键值对是接近很多有匹配关系业务的真实应用场景,如物流(订单、点到点)、游戏(玩家对应的装备)、社交(用户之间的关系和动态)等,都能直接匹配,高效存取。

MySQL:
1. 需要严密的数据结构的人事管理、大型企业网站。
2. 对于事务一致性和隔离性有高要求的金融、电商、军事等高并发的网站。

综合来看MongoDB没有事务机制,不能很好地满足许多复杂业务,更多的是当做一种工具,去实现某些局部、零散的需求,提高效率,而MySQL有完善的理论,可以应对绝大部分业务场景,更适合去服务各种实际应用和业务。


posted @ 2018-12-06 11:42  蛇夫座  阅读(138)  评论(0)    收藏  举报