引言
NoSQL(Not Only Sql),泛指非关系型的数据库。
背景:随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模,超大流量以及高并发的时候得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NoSQL与关系型数据库的比较
比较 | 关系型数据库 | NoSQL |
---|---|---|
存储方式 | 表格式(行和列),便于关联协作存储和数据提取 | 存储在数据集,如文档、键值对或者图结构 |
存储结构 | 预定义了结构(列的定义:确定数据的形式和内容),具有可靠性和稳定性但是难以修改 | 动态结构,易于适应数据类型和结构的变化 |
存储规范 | 高规范性,分割细化数据到关系表,以避免重复和获得精简的空间,数据管理逻辑清晰但是操作麻烦 | 存储成了一个整体,数据存储可能重复,但整块数据更加便于读写 |
存储扩展 | 纵向扩展(想要提高处理能力,要使用速度更快的计算机) | 横向扩展(存储是分布式的,可以通过给资源池添加更多的普通数据库服务器来分担负载) |
查询方式 | 结构化查询语言来操作数据库(SQL:CURD),预定义优化方式(如索引)加快查询 | 以块为单元操作数据非结构化查询语言(UnQl),无标准,基于更简单更精确的数据访问模式优化查询 |
事务 | ACID规则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),对事务支持性更强 | BASE原则(基本可用(Basically Availble)、软/柔性事务(Soft-state )、最终一致性(Eventual Consistency)) |
性能 | 数据一致性强,读写性能比较差。高并发读写性能非常差,海量数据处理效率非常低 | 无需sql的解析,提高了读写性能。 |
常用数据库 | SQL Server,Mysql,Oracle | redis,memcache,MongoDb |
授权方式 | 大部分付费 | 大部分开源 |
总的来说,Nosql相比于传统的关系性数据库来说,具有高效集群、不使用关系模型、开源、易扩展和灵活的数据模型等优点。
Compose.io 的开发者 DJ Walker-Morgan 也说过:“NoSQL 就像我购买营养食品去减肥一样,负责的是控制,必须有严格的纪律和谨慎的管理才适用”。
所以说关系型数据库还是主流,Nosql目前来说主要是作为超大规模,超大流量以及高并发情景下的解决方案。也许不久的将来,Nosql会越来越完善,向事务支持和大规模高并发两极发展,而关系型数据库也将在保证稳定性安全性的同时针对大规模和高并发找到一些更有效的解决方案。可以说Nosql的高速发展,促进了数据库行业的高效快速发展。(就目前所持认知的想法,不知道理解的对不对)
分类
Nosql可以分为键值(Key-Value)存储数据库、列存储数据库和图形(Graph)数据库四种数据库。
分类 | 例子 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值存储数据库 | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
列存储数据库。
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.
因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。
参考:
- Nosql简介 Redis,Memchche,MongoDb的区别
- Nosql百度百科
- NoSQL 简介
- 关系型数据库与NoSQL的对比
- Nosql 理解篇+实战篇 一 了解nosql
- NoSQL 没毛病,为什么 MySQL 还是“王”?