目录
NoSQL(非关系型数据库)与SQL(关系型数据库)的差别
1.数据结构:结构化与非结构化
2.数据关联:关联性与非关联性
3.查询方式:SQL查询与非SQL查询
4.事务特性:ACID与BASE
分析ACID与BASE的含义:
5.存储方式:磁盘与内存
6.扩展性:垂直与水平
7.使用场景
NoSQL(非关系型数据库)与SQL(关系型数据库)的差别
1.数据结构:结构化与非结构化
SQL是关系型数据库,它是具有结构化的。
分析:
在项目设计之初,我们就进行确定了数据表对应各个字段对应的约束条件以及数据类型及其大小
一旦我们构建出了对应的数据表之后,我们之后进行插入或操作数据 那么都是基于这个结构去进行的,这就是结构化。
由于我们的数据表是面向业务的,所以一旦我们确立了表之后就不会再轻易去进行修改表的结构对应的约束了。因为一旦牵扯数据量过大,会影响很多记录。如果影响过多数据记录,甚至会导致锁表 !
举例:MySQL就是一种表类型存储的,表可以有许多字段,字段被很多数据类型所修饰。并且可以有主键,外键等等。
NoSQL是非关系型数据库,非结构化。 数据结构的形式是不一定的,可变化的。
分析:
存储数据记录对应的数据结构是多种多样的。并且当我们确定存储之后,我们也可以进行随意修改数据对应的结构。这一点和SQL类型数据库正好相反。并且对于存储数据,加一个减一个数据 对于整体的影响也不大。
举例:Redis是Key-Value键值型的。MongoDB是文档类型的。HBase是列类型的。Neo4j是Graph类型的
2.数据关联:关联性与非关联性
SQL中多张表之间会构成关联关系 这就是关联性。
NoSQL是非关联性的,数据之间是无关联的,如果非要构建关联,也需要我们自己去进行设定。
3.查询方式:SQL查询与非SQL查询
SQL:语句结构统一。
分析:无论是MySQL还是Orcle,查询都是select * from 表名
非SQL:优势在于它简单,语法贴近我们日常开发语法。缺点就是不同的NoSQL类型数据库对应的语法不同
分析:对于不同类型的NoSQL数据库,查询语句差别很大。
4.事务特性:ACID与BASE
SQL关系型数据库,对应事务是一致性的,即是ACID。适合使用于相关业务对数据安全性较高的场景。
非SQL:对事务一致性基本满足 有可能不满足,即是BASE。安全性不高,适用于对性能要求高的业务。
分析ACID与BASE的含义:
ACID:
事务是由一组SQL语句组成的逻辑处理单元,事务具有以下四个属性,通常简称为事务的ACID属性。
(1) 原子性(Atomicity)
事务是对一个原子操作单元,其中对数据的修改,要么全部执行,要么全部不执行。
(2)一致性(Consistent)
在事务开始和完成时,数据都必须保证一致状态,这就意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性。
(3) 隔离性(Isolation)
数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境下执行。这就意味着对外部是不可见的。
(4) 持久性(Durable)
事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能保持。
BASE:
1.基本可用(Basically Available): NoSQL允许分布式系统中某些部分出现故障,那么系统的其余部分依然可用。它不会像ACID那样,在系统出现故障时,进行强制拒绝,允许继续部分访问。
2.软状态(Soft State): NoSQL在数据处理过程中,允许这个过程,存在数据状态暂时不一致的情况。但经过纠错处理,最终会一致的。
3.最终一致性(Eventually Consistent): NoSQL的软状态允许数据处理过程的暂时不一致,但是最终处理结果将是一致的,说明NoSQL对数据处理过程可以有短暂的时间间隔,也允许分更细的步骤一个一个地处理,最好数据达到一致即可。这在互联网上进行分布式应用具有其明显的优势。
5.存储方式:磁盘与内存
存储方式:
SQL类型的数据库的数据是存储在磁盘上面的。NoSQL是存储在内存中的。这就意味着NoSQL类型的数据库进行查询时效率更高!但是内存是有限度的。
6.扩展性:垂直与水平
对于SQL类型的数据库,比如说:MySQL数据库。设计者一开始设计的时候就没有考虑到后续的扩展性能问题,它是垂直扩展的,所谓垂直扩展即是:MySQL数据库主从同步,但是主机和从机的数据保持一致性,从机只负责进行读,主机负责写,一定程度上提升了查询的效率。但是对于数据的存储量的提升,我们还是需要从数据库所在的服务器进行着手,这很大程度上就限制了业务场景。
对于NoSQL类型的数据库,比如说:Redis缓存,设计者一开始就考虑到其后续的性能扩展性,所以扩展时可以进行水平扩展,所谓水平扩展即是:我们可以把数据部署在多条服务器上,这样弥补了SQL类型数据库的数据存储依赖服务器性能上限的问题。Redis存储数据一般即是:通过Hash运算计算出该数据最终是存储在哪一个节点上的。
7.使用场景
SQL:(1)数据结构固定 (2)相关业务对数据安全性,一致性要求高
NoSQL:(1)数据结构不固定 (2)对一致性,安全性要求不高 (3) 对性能要求高
其实SQL与NoSQL类型的数据存储可以一起使用,相辅相成。比如:MySQL与Redis,对于数据的存储为了考虑到安全性,我们存储到MySQL数据库中,但是对于热点数据的读取,我们可以放置到Redis缓存中。
总结不易,期待三连支持,谢谢大家。