关系数据库(Relational Database)是创建在关系模型基础上的数据库,借助于几何代数等数学概念和方法来处理数据库中的数据。所谓关系模型是一对1、一对多或者多对多等关系,支持事务和持久化,关系型数据库都会支持的 ACID 特性,也就是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),通常遵循三范式设计思想,常见的关系型数据库有 Oracle、SQL Server、DB二、MySQL 等。java
而文档型数据库是一种非关系型数据库,非关系型数据库(Not Only SQL,NoSQL)正好与关系型数据库相反,它不是创建在“关系模型”上的数据库。文档型数据库的典型表明是 MongoDB。面试
非关系型数据和文档型数据库属于包含关系,非关系型数据包含了文档型数据库,文档型数据库属于非关系型数据。redis
非关系型数据一般包含 3 种数据库类型:文档型数据库、键值型数据库和全文搜索型数据库,下面分别来看每种类型的具体用途。mongodb
文档型数据库以 MongoDB 和 Apache CouchDB 为表明,文档型数据库一般以 JSON 或者 XML 为格式进行数据存储。数据库
以 MongoDB 为例,它是由 C++ 编写的一种面向文档的数据库管理系统,在 2007 年 10 月 由 10gen 团队所开发,并在 2009 年 2 月首度推出。MongoDB 是以二进制 JSON 格式存储数据的,MongoDB 对 JSON 作了一些优化,它支持了更多的数据类型,这种二进制存储的 JSON 咱们也能够称之为 BSON(Binary JSON)。数组
BSON 具有三个特色:轻量、可遍历以及高效,它的缺点是空间利用率不是很理想。MongoDB 使用 BSON 进行存储的另外一个重要缘由是 BSON 具有可遍历性。缓存
MongoDB 存储结构示例以下:数据结构
{"_id":ObjectId(“57ce2d4cce8685a6fd9df3a3"),"name":"老王","email":['java@qq.com','java@163.com']}
其中,“_id”为 MongoDB 默认的主键字段,它会为咱们生成一块儿全局惟一的 id 值,而且这个值在作数据分片时很是有用。分布式
文档型数据库的使用场景以下。性能
• 敏捷开发,由于 MongoDB 拥有比关系型数据库更快的开发速度,所以不少敏捷开发组织,包括纽约时报等都采用了 MongoDB 数据库。使用它能够有效地避免在增长和修改数据库带来的沟通成本,以及维护和建立数据库模型成本,使用 MongoDB 只须要在程序层面严格把关就行,程序提交的数据结构能够直接更新到数据库中,并不须要繁杂的设计数据库模型再生成修改语句等过程。
• 日志系统,使用 MongoDB 数据库很是适合存储日志,日志对应到数据库中就是不少个文件,而 MongoDB 更擅长存储和查询文档,它提供了更简单的存储和更方便的查询功能。
• 社交系统,使用 MongoDB 能够很方便的存储用户的位置信息,能够方便的实现查询附近的人以及附近的地点等功能。
键值数据库也就是 Key-Value 数据库,它的典型表明数据库是 Redis 和 Memcached,而它们一般被当作非持久化的内存型数据库缓存来使用。固然 Redis 数据库是具有可持久化得能力的,可是开启持久化会下降系统的运行效率,所以在使用时须要根据实际的状况,选择开启或者关闭持久化的功能。
键值型数据库以极高的性能著称,且除了 Key-Value 字符串类型以外,还包含一些其余的数据类型。以 Redis 为例,它提供了字符串类型(String)、列表类型(List)、哈希表类型(Hash)、集合类型(Set)、有序集合类型(ZSet)等五种最经常使用的基础数据类型,还有管道类型(Pipeline)、地理位置类型(GEO)、基数统计类型(HyperLogLog)和流类型(Stream),而且还提供了消息队列的功能。
此数据库的优势是性能比较高,缺点是对事务的支持不是很好。
传统的关系型数据库主要是依赖索引来实现快速查询功能的,而在全文搜索的业务下,索引很难知足查询的需求。由于全文搜索须要支持模糊匹配的,当数据量比较大的状况下,传递的关系型数据库的查询效率是很是低的;另外一个缘由是全文搜索须要支持多条件随意组合排序,若是要经过索引来实现的话,则须要建立大量的索引,而传统型数据库也很难实现,所以须要专门全文搜索引擎和相关的数据库才能实现此功能。
全文搜索型数据库以 ElasticSearch 和 Solr /sɔ:lʌ/为表明,它们的出现解决了关系型数据库全文搜索功能较弱的问题。
是一个基于分布式文件存储的数据库(文档型数据库),介于关系型和非关系型数据库间。它支持的数据结构相似于JSON的BSON格式,所以能够存储比较复杂的数据类型。
Mongodb最大的特色是它支持的查询语言很是强大,支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档相似于 JSON 对象。字段值能够包含其余文档,数组及文档数组
使用场景:
• 敏捷开发,由于 MongoDB 拥有比关系型数据库更快的开发速度,所以不少敏捷开发组织,包括纽约时报等都采用了 MongoDB 数据库。使用它能够有效地避免在增长和修改数据库带来的沟通成本,以及维护和建立数据库模型成本,使用 MongoDB 只须要在程序层面严格把关就行,程序提交的数据结构能够直接更新到数据库中,并不须要繁杂的设计数据库模型再生成修改语句等过程。
• 日志系统,使用 MongoDB 数据库很是适合存储日志,日志对应到数据库中就是不少个文件,而 MongoDB 更擅长存储和查询文档,它提供了更简单的存储和更方便的查询功能。
• 社交系统,使用 MongoDB 能够很方便的存储用户的位置信息,能够方便的实现查询附近的人以及附近的地点等功能。
(1) Mongodb在4.0前不支持事务,靠客户端保证,redis支持事务。
(2) Redis 支持的数据结构丰富, MongoDB 数据结构比较单一,可是支持丰富的数据表达
(3) mongodb适用于存储海量数据,redis不适合存储海量数据(受物理内存限制)。
MongoDB 在 4.0 以前是不支持事务的,不支持的缘由也很简单,由于文档型数据库和传统的关系型数据库不同,不须要知足三范式。文档型数据库之因此性能比较高的另外一个主要缘由,就是使用文档型数据库不用进行多表关联性查询,由于文档型数据库会把相关的信息存放到一张表中。所以,无需关联多表查询的 MongoDB,在这种状况下的查询性能是比较高的。
把全部相关的数据都放入一个表中,这也是 MongoDB 以前很长一段时间内不支持事务的缘由,它能够保证单表操做的原子性,一条记录要么成功插入,要么插入失败,不会存在插入了一半的数据。所以,在这种设计思路下,MongoDB 官方认为“事务功能”的实现没有那么紧迫。
但在 MongoDB 4.0 之中正式添加了事务的功能,而且在 MongoDB 4.2 中实现了分布式事务的功能,至此 MongoDB 开启了支持事务之旅。
关系型数据和文档型数据库有什么区别?
谈谈你对mongodb的理解?特性?mongodb用来作什么的?(蓝月亮1-3)
mongodb和redis区别?(蓝月亮1-3)
拉钩教育 -- https://kaiwu.lagou.com/course/courseInfo.htm?courseId=59#/detail/pc?id=1778