NoSQL简史及定义
NoSQL
这个术语最早是在 1998 年被Carlo Strozzi
命名在他的轻量的,开源的关系型数据库上的,但是该数据库没有提供标准的SQL
接口;
在2009 年再次被Eric Evans
提起,讨论分布式开源数据库的问题,这是的NoSQL
主要指的非关系型,分布式的,不提供关系型的atomicity(A)
,consistency(C)
,isolation(I)
,durability(D)
即ACID
的特性;
紧接着2009年在亚特兰大举行的no:sql讨论会是一个里程碑,当时的口号是select fun, profit from real_world where relational=false,因此之后对于NoSQL
最普遍的解释为非关系型的,强调Key-Value
和Document(文档)
数据库的优点,并非单纯的反对关系型数据库;
下面给NoSQL
下一个定义,如果你在网上查阅资料会得到很多种定义,大家的理解不尽相同,我这里引用 http://nosql-database.org/ 网站上的定义:下一代,主要解决以下几点:非关系数据库、分布式数据库、开源数据库和水平扩展数据库
原文信息:Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable
对于 NoSQL这个词语,现在最普遍的理解就是:Not Only SQL
常见的NoSQl数据库以及分类
NoSQL
仅仅是一个概念,还可以根据数据库存储数据的模型和特点分为以下种类
Key-Value
存储,代表数据库为Redis
,可以通过Key
快速的查找到对应的Value
值,非常适合存储不涉及过多数据关系的业务数据,一般保存在内存中,可以有效的减少读写磁盘的IO
次数,提高了读写性能Documnet
文档型 存储,代表数据库为MongoDB
, 文档的内容一般使用类似JSON
的格式,存储的内容就是文档型的,由于文档数据库的no-schema的特性,可以存储和读取任意的数据,很好的解决的数据结构字段不确定的问题。对于文档型的数据库,一般是可以在某个字段上建立索引的等,文档之间可以进行关联,也就是说可以实现一些关系型数据库的功能特性XML
存储,代表数据库为Berkeley DB XMl(BDB XML)
,是一个嵌入式数据库,专门用于存储和检索XML格式的文档,支持XQuery
这种查询语言对XML
文档进行高效的查询Graph
图存储 代表数据库为Neo4J
为最流行的图数据库,应用图形理论(这里可以学习一下有关图的数据结构)存储实体之间的关系信息,最常见的应用就是保存社交网络中人与人之间的关系比如微信好友之间的关系,还可以使用在推荐系统,如果我们将数据以图的形式表现,那么将会非常有益于推荐规则的制定,这类数据库可以很方便了解决了关系型数据库存储这类数据的缺点,查询慢,设计复杂的问题Column
列存储 代表数据库为HBase
,传统的关系型数据库是按照行来存储数据的,因此可以称为“行数据库”,而列数据库是按照列来进行存储数据的,使用列存储可以的根据某一列数据类型特征选择不同的算法来压缩数据,提高存储空间的利用率;当读取多条数据的同一列的时候,读取效率非常高,因为这些列的数据都放在一起存储的;该类型的数据库适合大量的数据存储的应用场景不适合小量的数据存储的应用场景,多用于大数据处理方面Object
对象存储 代表数据库db4o
该类型的数据库用的不多,主要特点是:通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据
对于现在我们听说的Elasticsearch
和NoSQL
的关系可以查这篇文章 https://www.elastic.co/cn/blog/found-elasticsearch-as-nosql ,可以把它归类为文档数据库的一种
对于非常详细的NoSQL
数据库分类和NoSQL
列表的详细信息(现已经超过255个了)可以查看这个网站 http://nosql-database.org/
关系型数据库与NoSQL数据库的区别
关系型数据库特点
- 高度组织化,结构化数据
- 结构化查询语言(SQL)
- 数据操作语言(DML),数据定义语言(DDL)
- 多表之间进行关联查询(
join
) - 严格的一致性(事务处理)
- ACID模型
对于关系型数据库的事务ACID
特性,这里做一下解释:
A(Atomicity)
: 原子性,原子的概念就是不可分隔,也就是说事务中的操作要么全部完成,要么都不做,事务成功的条件是事务中的所有操作都成功,只要事务中有一个操作失败,真个事务就失败,就行回滚C(Consistency)
: 一致性,指进行事务操作后,由原来的一致性状态变成另一种一致性的状态,也就是事务提交后,或者事务回滚后,数据库的完整性一致性约束不能被破坏。任何数据写入数据库必须是有效的根据已定义的规则,包括约束,触发器,任何组合,引用完整性保证主键,外键关系I(Isolation)
: 隔离性,事务之间不会相互影响,每个事务是彼此独立的,也就是在一个事务提交之前对其他事务是不可见的D(Durability)
: 持久性,指一旦事务提交后,它所做的修改将会永久的保存在数据库中,即使出现服务宕机也不会丢失
NoSQL数据库特点
- 没有固定的数据结构,键-值对存储,列存储,文档存储,图形数据库,可以灵活的进行扩展
- 没有标准的查询话语言,几乎每一种
NoSQL
数据库都会有自己独特的查询语言 - 最终一致性,非ACID
- CAP模型
- 高性能,可扩展,非常容易进行水平扩展
说明:这里CAP只是简单提了一下,在下一篇会有文章专门来解释CAP定理
NoSQL和SQL的区别
- 关系型数据库基于
ACID
模型,NoSQL
非关系型基于CAP
模型 - 数据存储结构:关系型数据库一般都是固定的表结构,通过
DDL
语句来进行修改,不是很容易进行扩展;而NoSQL
非关系型存储的机制就比较多了,就如上面所说的基于文档的,基于键-指的等等,对数据的格式十分灵活没有固定的表结构,方便进行扩展 - 数据的一致性:
NoSQL
非关系型数据库强调最终一致性,没有像关系型数据库ACID
强调强一致性,从非关系型数据库中读到的有可能还是处于一个中间态的数据,因此如果你的业务对于数据的一致性要求很高,那么非关系型数据库并不一个很好的选择
思考:对于关系型数据库
与NoSQL非关系型数据库
你有什么样不同的理解,欢迎留言讨论。