【大话面试】- Redis 篇-第一篇
认识 NoSQL
SQL
VS NoSQL
1️⃣ 结构化(Structured)
SQL 的存储格式
NoSQL
从其存储的结构上来看,对于 SQL 数据库而言,我们可以给每一个表的属性添加不同的约束(主键唯一,无符号,数据长度,数据类型)等。
一旦我们在表中插入的数据过多,比如上千万条数据。我们如果一旦修改表的某一个字段,那么所带来的影响是非常巨大的,比如锁表,表与业务相关联表发生变动,则业务也需要进行修改。
而对于 NoSQL 的数据库,并没有 SQL 型数据库这样的强行约束。常见的有像 Key-Value 形式的键值对存储,或者 Document 文档形式以及 Graph 图形式,这种形式的数据结构本身是比较宽松的,多一个字段或其少一个字段,所造成的影响都是非常小的。
2️⃣ 关联化(Relational)
SQL 关系化
NoSQL 关系化
首先对于 SQL 关系化数据库,由于表与表之间可以通过建立外键之间进行关联,所以当我们删除其中一个表时数据库会自动的维护,对一些不恰当的操作禁止执行,而这种的关系性关联同时也节省了存储的空间(不需要将外键的信息同时存储到主键当中)。
而对于 NoSQL 非关系化的数据库而言,如上图所示,一个订单信息中,及时一些信息丢失也不会造成一些异常。同时这种非关系的存储,会使得同一个订单中出现多个重复的商品,比如张三买了 两台 荣耀6 ,这就意味着 荣耀6 这个商品就需要在订单中重复出现两次。
那有一些同学会说,我们可以单独创建一份关于商品的 Document,可以通过像 SQL 一样进行相互的关联呢?嗯,是的没错。但是这样就要求我们的建立的这种关系需要程序员自己的去进行维护了,维护的成本就变高了。
3️⃣ SQL 查询
SQL 的执行语句
NoSQL 的执行语句
可以看到对于 SQL 语句来说,无论是对于我们常用的 MySql 还是 SQLServer 其语句都通用的,语法通用,但这种的语法比较复杂。
但对于 NOSql 数据库而言,其语法非常的简单,只有其键值对的这种形式,但也可以看到 NoSQL 的语法对于不用的数据库而言,其语法不同,这就要求对 NoSQL 数据库掌握的语法较多了。
4️⃣ 事务
SQL 数据库的事务 ACID
NoSQL 数据库的事务 BASE
两种数据库的对比总结
SQL | NoSQL | |
---|---|---|
数据结构 | 结构化(Structured) | 非结构化 |
数据关联 | 关联化(Relarional) | 无关联 |
查询方式 | SQL查询 | 非SQL |
事务特征 | ACID | BASE |
存储方式 | 磁盘 | 内存 |
扩展性 | 垂直 | 水平 |
使用场景 | 1. 数据结构固定 2.相关业务的数据安全性、一致性要求较高 | 1. 数据结构不稳定 2. 对一致性、安全性要求较高 3. 对性能要求 |
-
存储方式:
对于存储方式来说,SQL 的文件都是存储在磁盘上的即便是对于 MySql、SqlServer 它们虽然具有缓存,但是其核心文件都是存储在磁盘上的。
NoSQL 比如常用的 Redis 数据存储在内存中,虽然有其持久化的方案,但是在实际数据读取时一般都是读取的内存中的数据,所以 Redis 的数据一般只要内存一掉电,数据就会丢失。但也说明了, NoSQL 操作数据的效率要比 SQL 高很多。
-
扩展性:
对于设计之初,SQL 型数据库起初是没有考虑数据分片的这种需求的,所以我们在储存数据的时候,数据都是存储在本机的。所以这也导致,影响其性能能只能是主机的本身,虽然说对于 SQL 数据库存在其主从读写的这种方案的,但是无论是对于读还是写,其存储的数据量是没有变的,主机与从机存储的数据量始终是一样的,只是增加了机器的数量。
但是对于 NoSQL 数据来说,在设计之初就考虑到数据拆分的这种需求,所以数据在是可以更具其 id 或者唯一的标识进行 Hash 运算,更具 Hash 运算的结果来决定将数据最终存放到哪一个节点上,天然的支持水平的扩展的。
虽然说 SQL 本身是不支持数据的拆分的,但是是可以通过第三方的组件,进行一些拆分的,同时也是因为引入了第三方的组件,在使用的时候考虑的问题同时也变多了。
-
使用场景:
如果说你的数据业务变更较少,一旦确定几乎不会发生大的变更的,或者说数据业务对其安全性,一致性的要求较高的,我们就使用关系型数据库。
比如说我们下一个订单,订单对其安全性要求就比较高,我们采用关系型数据库。但是我们为了提高查询的性能,我们可以冗余的将一部分数据放到非关系型的数据库中,提升其查询的效率。