SQL和NoSQL
数据库可以分为关系型数据库
和非关系型数据库
,SQL(Structured Query Language)
相信大家并不陌生,这是用于操作关系型数据库
的语言,而NoSQL
,顾名思义,它对应的就是非关系数据库
,它是操作非关系型数据库的技术类别。二者有很多地方是相同的,因为它们都是操作数据库的技术,但二者又有很多的不同之处,下面让我们从不同的角度了解二者的差异。
结构化(Structure)
SQL
是结构化的查询语言,其结构化表现在数据是以一张二维表的形式保存在数据库中的,并且在创建表的时候,可以给表添加约束和字段限制。这些约束一旦建立好了,则这张二维表的结构就确定了,之后插入表中的数据就需要严格按照表的结构进行插入。并且表的结构是不建议修改的,需要在项目初期就确定好整张表的结构——由此也可以看出结构化对于SQL
的重要性。
而NoSQL
则是非结构化的
,其对于数据的结构并没有严格的约束——但并不是意味着完全没有约束,需要根据NoSQL
数据库的类型具体分析。但不论是哪种,相较于SQL
的数据结构都比较松散,并没有这么强的结构和约束。
关系型
SQL
对应的是关系型数据库
,表中的数据是有关联的。比如有三张表tb_user(用户表)
、tb_item(商品表)
、tb_order(订单表)
,这三张表看似是没有任何关系的,但是可以通过foreign key
外键技术让三张表产生关系:
在删除数据的时候,必须按照外键的关系按照顺序删除。
而NoSQL
数据库本身是不会维护这种表之间的关系的,如果想要有SQL
数据库一样的关系们必须依靠程序员自己维护。
SQL查询
关系型数据库
可以通过SQL语句
完成查询,并且SQL语句
在关系型数据库中是通用的,不论是MySQL
或者Oracle
或者SQLSever
,SQL语句
都是通用的,其格式是固定的,语法也是固定的。
而非关系型数据库
中的查询语句完全不固定,根据不同的非关系型数据库
,有不同的查询语句。
上图是三种常见非关系型数据库
的查询语句,如图所示,三者都实现了查询id为1的用户信息
这个功能,但是查询的语句却是大相径庭的:Redis
是一种命令、MongoDB
是一种基于函数形式的调用、elasticsearch
是一种基于RESTful风格的请求
。
事务
确保事务
可靠执行的四个特性是ACID(Atomicity原子性、Consistency一致性、Isolation隔离性、Durability持久性)
,在关系型数据库
中,经常会使用到事务,特别是涉及到多表操作时,而数据库底层可以帮助我们实现ACID
的特性,所以说可以认为所有的关系型数据库都是满足ACID特性
的。
而非关系型数据库
对于事务的ACID特性
支持并不完善,有的数据库无法满足事务的强一致性,只能满足基本一致性,有的数据库甚至不支持事务。
存储方式
关系型数据库
数据库中的数据存储一般是在磁盘中,而非关系型数据库
数据库中的数据一般是存储在内存中。通过一些计算机组成原理的知识,我们可以知道内存的读写速度是远远高于磁盘的,所以说一般基于内存存储的非关系型数据库
的查询速度会远远高于基于磁盘存储的关系型数据库
。但由于内存的容量较小,非关系型数据库
的数据容量也会小于关系型数据库
,并且内存资源十分的宝贵,所以说一般不用来作持久化存储。
总结
上表就是SQL
和NoSQL
的主要区别,在实际开发中可以按照具体的使用场景来选择具体需要使用的数据库,但是在更多的情况下,会将二者结合起来使用,通过SQL
的结构化存储来持久化保存数据;然后通过NoSQL
的极致性能来做数据缓存,提升查询效率。