数据库 --> SQL 和 NoSQL 的区别

SQL 和 NoSQL 的区别

 

1、概念

  SQL (Structured Query Language) 数据库,指关系型数据库。主要表明:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。
  NoSQL(Not Only SQL)泛指非关系型数据库。主要表明:MongoDB,Redis,CouchDB。
 

2、区别

一、存储方式

   SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式能够省是JSON文档、哈希表或者其余方式。SQL一般以数据库表形式存储数据。举个栗子,存个学生借书数据:
而NoSQL存储方式比较灵活,好比使用类JSON文件存储上表中熊大的借阅数据:
 

二、表/数据集合的数据的关系

   在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引(index),触发器(trigger),存储过程(stored procedure)等。 表结构能够在被定义以后更新,可是若是有比较大的结构变动的话就会变得比较复杂。在NoSQL中,数据能够在任什么时候候任何地方添加,不须要先定义表。例以下面这段代码会自动建立一个新的"借阅表"数据集合:
NoSQL也能够在数据集中创建索引。以MongoDB为例,会自动在数据集合建立后建立惟一值_id字段,这样的话就能够在数据集建立后增长索引。
从这点来看,NoSQL可能更加适合初始化数据还不明确或者未定的项目中。
 

三、外部数据存储

   SQL中如何须要增长外部关联数据的话,规范化作法是在原表中增长一个外键,关联外部数据表。例如须要在借阅表中增长审核人信息,先创建一个审核人表:
再在原来的借阅人表中增长审核人外键:
这样若是咱们须要更新审核人我的信息的时候只须要更新审核人表而不须要对借阅人表作更新。而 在NoSQL中除了这种规范化的外部数据表作法之外,咱们还能用以下的非规范化方式把外部数据直接放到原数据集中,以提升查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。
 

四、SQL中的JOIN查询

   SQL中可使用JOIN表连接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。NoSQL暂未提供相似JOIN的查询方式对多个数据集中的数据作查询。因此大部分NoSQL使用非规范化的数据存储方式存储数据。
 

五、数据耦合性

   SQL中不容许删除已经被使用的外部数据,例如审核人表中的"熊三"已经被分配给了借阅人熊大,那么在审核人表中将不容许删除熊三这条数据, 以保证数据完整性。而NoSQL中则没有这种强耦合的概念,能够随时删除任何数据。
 

六、事务

   SQL中若是多张表数据须要同批次被更新,即若是其中一张表更新失败的话其余表也不能更新成功。这种场景能够经过事务来控制,能够在全部命令完成后再统一提交事务。 而NoSQL中没有事务这个概念,每个数据集的操做都是原子级的。
 

七、增删改查语法

 

八、查询性能

  在相同水平的系统设计的前提下,由于NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。
 
 

3、补充

  目前许多大型互联网项目都会选用MySQL(或任何关系型数据库) + NoSQL的组合方案。
 
关系型数据库适合存储结构化数据,如用户的账号、地址:
  1)这些数据一般须要作结构化查询(嗯,好像是废话),好比join,这时候,关系型数据库就要胜出一筹
  2)这些数据的规模、增加的速度一般是能够预期的
  3)事务性、一致性
 
NoSQL适合存储非结构化数据,如文章、评论:
  1)这些数据一般用于模糊处理,如全文搜索、机器学习
  2)这些数据是海量的,并且增加的速度是难以预期的,
  3)根据数据的特色,NoSQL数据库一般具备无限(至少接近)伸缩性
  4)按key获取数据效率很高,可是对join或其余结构化查询的支持就比较差
 
  基于它们的适用范围不一样,目前主流架构才会采用组合方案,一个也不能少。目前为止,尚未出现一个可以通吃各类场景的数据库,并且根据 CAP理论,这样的数据库是不存在的。 
相关文章
相关标签/搜索