SQLvsNoSQL
关系型数据库与非关系型数据库的联系与区别
老师布置的作业是让关系型数据库与非关系型数据库的联系。一说到联系,往常不都是谈论的区别吗,怎么突然有了联系了,疯狂的查资料,终于有了以下见解。(顺带记录第一次用markdown写博客)
参考:https://blog.csdn.net/han_cui/article/details/60765969
参考:(还有一个主要参考的找不见了,总之特别特别感谢)
总体大纲如下:
关系型数据库
很多的地方都有关于非关系型的数据库的详细介绍,所以只说以下非关系型
首先聊到了关系型数据库,列出了这样的一个表格:
稍稍补充:
关系型数据库的ACID:(或者说是事务的ACID)
关于关系型数据库同理说事务的原子性,一致性,独立性,持久性的自己的一些理解
- A:Atomicity,原子性,整个数据库是一个整体要变化一起变化。举个例子:小A用银行向小B转了100元,当小B实际上并没有得到钱也就是说小B得到钱失败了,这时小A转钱也是失败的。也就是说 小A-100&&小B+100,要么成功,要么失败。
- C:Consistency,一致性,自己一开始无法理解这个一致性是什么意思,查了很多的博客,有了这样的理解。还是小A转账,这意味着小A-100,小B+100,一致性就是,就这100块钱,要么在小A那里,要么在小B那里,不会出现有A-100,B+0这种负现象。或者说,变化的总和总是0.
- I:Isolation,独立性,隔离性。未提交修改时对数据访问的独立。比如,小A想买个手机;小A查询库存量100个;小B查询库存量100个;小A下单买了一个手机;小B查询库存量99个;小A买不起,购买失败;小B查询库存量100个。
- D:Durability,持久性,一旦提交,永久保存!
缺点:
海量数据读写时,硬盘的I/O流是很大的瓶颈
难以横向拓展,没有办法通过简单的方式添加更多的硬件拓展性能。
应用:这里的bank是自己想用银行的例子,银行转账,就是从一个用户➖?,另一个用户➕?,这是必须必须要一致的!
SQL vs NoSQL 关系型数据库与非关系型数据库的区别
简单的说几个:
1.存储方式
sql是特定的表中存储,适合存储结构化数据进行结构化查询
太过古板?
试一试nosql:
nosql灵活可拓展,还支持json hash等结构随你选
2.表/数据集合的关系
sql预定义表结构和字段结构,对于增长速度和现规模可以预期的数据,是个不错的选择。
但是对于尚不明确的预期,nosql更加的灵活多变可拓展
3.拓展
sql所支持的是纵向拓展,是提高计算机的性能来提高处理能力的。这么说的话,其实对于sql的拓展,仅靠提供计算机性能提升能力的话 有点 难的。
nosql支持的是横向拓展,分布式结构通过集群实现负载均衡的。这么看的话,它对于海量数据的读写,高并发读写性能高。
事务
首先,什么是事务呢?
事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
那么sql和noql对于事务有什么区别呢?
sql:所有命令完成后,统一提交
若多张表同时更新,其中一张表更新失败,其他表也不会成功,事务回滚
nosql:没有事务
每一个数据集都是原子级别的
ACID降低数据冗余和不一致的概率,可靠处理事务并保持事务的完整性,还是银行转帐的例子,一个用户扣,一个用户加
nosql倾向于的是 最终一致性
除此之外,还有关于成本问题的区别:nosql大多是开源的,所以成本较为低廉;对于sql很多都是闭源的软件,成本上并不占优势。
关系型数据库和非关系型数据库的联系
三个问题(胡思乱想)
问题一:小A,小B谁的分数比较高?
关系型数据库支持对数据的筛选排序,读写性能有所下降,
获取不同数据间的逻辑关系 ——关系型数据库
问题二:
小A,小B的家庭住址——个人信息数据库
小A,小B的数学成绩——2019年期末成绩数据库
小A,小B的团员信息——团档案库
关系型数据库的特点决定了数据库是在一个较高的全局看所有完整数据的关系。
这里所说的就是横向切割,特点就是反应两个数据库的适配性。
mysql是关系型数据库➕硬盘型数据库
重头戏来了,nosql是这俩的相对的
也就是说nosql是非关系型和内存型的
问题三:小A给小B一块钱
nosql的特点是实时快速小范围,内存里nosql就把这件事情处理了,所以比硬盘型数据库要快很多。不关心某个对象全局下和其他对象的关系,只求快速读写!
进入正题
nosql和mysql水火不容吗?
no no no no no no
水火不容?
目前许多大型互联网项目都会选用MySQL(或任何关系型数据库) + NoSQL的组合方案。
SQL适合存储结构化数据,如用户的帐号、地址:适合结构化查询,join等;适合增长规模可预期的数据;适合需要一致性和事务性的;
NoSQL适合存储非结构化数据,如文章、评论:对于要进行模糊处理的:全文搜索,机器学习;对于海量数据难以预估的;对于某些按照KEY可能获取效率更高的。
举例
去哪儿使用MySQL支撑公司大部分OLTP业务,有上千台规模。
针对热点数据以及对访问延时特别敏感的业务,大规模的使用Redis做缓存。
对于数据量非常大,又不不利于分库分表的数据,选择性的使用HBase
PS :这大多只是自己个人认识,如有不对的希望指正