SQL vs NoSQL
SQL(关系型数据库)
- 使用结构化查询语句(Structured Query Language)来定义和管理数据
- 通用且使用广泛,能够安全适用于复杂查询密集的环境
- 使用之前需要进行数据结构定义,所有数据遵循相同结构,结构的变化较难应付
- MySql,Oracle,Sqlite,Postgres和MS-SQL
NoSQL(非关系数据库/分布式数据库)
- 非结构化数据动态模式,数据以多种方式存储,可以面向列、面向文档、基于图或者K-V模式存储
- 没有标准接口来执行复杂查询
- 数据文档无需进行预先定义和结构声明,每个文档可以拥有不同的结构,数据域能随意拓展
- MongoDB,BigTable,Redis,RavenDb,Cassandra,Hbase,Neo4j和CouchDb
拓展性
- SQL具备垂直拓展性,可通过增加CPU/RAM/SSD来提升负载能力
- NoSQL具备水平拓展性,可通过增加更多服务器提升负载能力
结构
- SQL数据库基于表存储
- NoSQL数据库基于文档/k-v对/图/宽列存储
数据存储类型
- SQL不支持分布式数据存储
- NoSQL能更好的适应分布式数据存储,因其使用了k-v对这样类似Json数据的数据存储方式,对于大型数据集的存储有更好的表现。Hbase就是一个很好的例子
事务应用
一个事务是一连串的操作组成,增删改查的集合
特性ACID:
- 原子性(Atomicity):要么完整执行,要么不执行
- 一致性(Consistency):执行前后,数据保持完整和逻辑一致(银行存款例子),原子性和持久性是事务一致性的充分条件
- 隔离性(Isolation):多个并发事务是独立的,上下文彼此隔离,互不干扰,使用锁机制进行数据线程安全控制。四种隔离级别
- 读未提交,其隔离级别最低,允许脏读。换句话说就是,如果一个事务正在处理某一数据,并对其进行了更新,但是同时没有提交事务,允许另一个事务也可以访问
- 读已提交,和读未提交的区别就是。读未提交可以读取到别人没有提交的数据,但是读已提交只能读取到别人提交后的值,事务进行的中间值不会读取到
- 可重复读,简单来说就是事务处理过程中多次读取同一个数据的时候,这个值不会发生改变,其值都和第一次查询到的数据是一致的
- 串行化,是最严格的隔离级别,他要求所有的事务都被串行执行,既事务只能一个接一个的进行处理,不能并发执行
- 持久性(Durability):在提交后已提交的数据应该能过永久保存,在系统发生异常后仍能回到异常发生前的状态
- SQL数据库最适合重量级事务类型应用程序,因为它更稳定,且承诺了数据的原子性和完整性
- NoSQL也可以在事务中应用,但是在高负载和复杂事务的应用环境下不能有更好的表现
外部支持
- SQL数据库有更丰富的提供商和解决方案作为支持
- NoSQL目前仍然依赖于社区