# mysql VS mongo
mysql: (SQL)关系型数据库
mongo: (NoSQL)非关系型数据库
# 对比
存储上
SQL 通常以数据库表的形式存储,例如存储用户信息,SQL中增加外部关系的话,需要在原表中增加一个外键,来关联外部数据表。例如需要在借阅表中增加审核人信息,先建立一个审核人表
再在原来的借阅人表中增加审核人外键
这样如果我们需要更新审核人个人信息的时候只需要更新审核人表而不需要对借阅人表做更新
NoSql 采用
key-value
的形式存储缺点也比较明显,更新审核人数据的时候将会比较麻烦
数据耦合性
SQL: 无法删除被使用的外部数据,例如审核人表中的"熊三"已经被分配给了借阅人熊大,那么在审核人表中将不允许删除熊三这条数据,以保证数据完整性。
NoSQL: 没有这种强耦合的概念,可以随时删除任何数据
事务
SQL中如果多张表需要同批次被更新,即如果其中一张表跟新失败的话,其他表也不会更新成功。这种场景可以通过事务来控制,可以在所有命令完成之后,再统一提交事务
在 NoSql 中没有事务这个概念,每一个数据集都是原子级别的
数据表 VS 数据集
关系型是表格型的,存储在数据表的行和列中。彼此关联,容易提取
而非关系型是大块存储在一起
预定义结构 VS 动态结构
在 SQL 中,必须定义好地段和表结构之后,才能够添加数据,例如定义表的主键、索引、外键等。表结构可以在定义之后更新,但是如果有比较大的结构变更,就会变的比较复杂。
在 NoSql 数据库中,数据可以在任何时候任何地方添加。不需要预先定义
存储规范 VS 存储代码
关系型数据库为了规范性,把数据分配成为最小的逻辑表来存储避免重复,获得精简的空间利用。但是多个表之间的关系限制,多表管理就有点复杂。
当然精简的存储可以节约宝贵的数据存储,但是现在随着社会的发展,磁盘上付出的代价是微不足知道的。非关系型是平面数据集合中,数据经常可以重复,单个数据库很少被分开,而是存储成为一个整体,这种整块读取数据效率更高
纵向拓展 VS 横向拓展
为了支持更多的并发量,SQL数据采用纵向扩展,提高处理能力,通过提高计算机性能来提高处理能力
NoSql通过横向拓展,非关系型数据库天然是分布式的,所以可以通过集群来实现负载均衡
# 选择
目前许多大型互联网都会选用MySql+NoSql的组合方案,因为SQL和NoSql都有各自的优缺点
关系型数据库适合存储结构化数据,比如:用户的账号、地址:
这些数据通常需要做结构化查询,比如说
Join
,这个时候,关系型数据库就要胜出一筹。这些数据的规模、增长的速度通常是可以预期的。
事务性、一致性,适合存储比较复杂的数据。
NoSql适合存储非结构化数据,比如:文章、评论:
这些数据通常用于模糊处理,例如全文搜索、机器学习,适合存储较为简单的数据。
这些数据是海量的,并且增长的速度是难以预期的。
按照
key
获取数据效率很高,但是对于join
或其他结构化查询的支持就比较差。
# 附加
事务四大特征(ACID)
原子性(A):原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
一致性(C):一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
隔离性(I):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果
持久性(D):意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚