关系型数据库 VS. NOSQL

关系型数据库

关系型数据库把所有的数据都通过行和列的二元表现形式表示出来,表间符合3NF。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。关系模型中常用的概念:

  • 关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名
  • 元组:可以理解为二维表中的一行,在数据库中经常被称为记录
  • 属性:可以理解为二维表中的一列,在数据库中经常被称为字段
  • 域:属性的取值范围,也就是数据库中某一列的取值限制
  • 关键字:一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成
  • 关系模式:指对关系的描述。其格式为:关系名(属性1,属性2, ... ... ,属性N),在数据库中成为表结构

传统关系型数据库系统的事务都有ACID的属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)

  • 原子性: 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节(现在很多任务都可能会有中间状态,比如网购放入购物车,物品的状态)。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
  • 一致性: 在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
  • 隔离性: 两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。 两个事务不会发生交互
  • 持久性: 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚

在数据库系统中,事务的ACID属性保证了数据库的一致性,比如银行系统中,转账就是一个事务,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和构成一个完整的逻辑过程,不可拆分,为原子,从而保证了整个系统中的总金额没有变化。但这些ACID特性对于大型的分布式系统来说,适合高性能不兼容的。比如,你在网上书店买书,任何一个人买书这个过程都会锁住数据库直到买书行为彻底完成(否则书本库存数可能不一致),买书完成的那一瞬间,世界上所有的人都可以看到熟的库存减少了一本(这也意味着两个人不能同时买书)。
整体感觉关系型数据库还是面向瞬时性的操作记录的。

NoSQL

NoSQL不是“No SQL”,而是“No Relational”,用于指代那些非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统,也就是现在常说的非关系型数据库。根据Eric Brewer’s CAP 理论,在设计分布式Web服务中,通常需要考虑三个应用的属性:一致性、可用性以及分区宽容性。但是在实际的设计中,不可能这三方面同时做的很好。为了提高性能,出现了ACID的一种变种BASE:

  • Basic Availability:基本可用
  • Soft-state :软状态/柔性事务,可以理解为”无连接”的, 而 “Hard state” 是”面向连接”的
  • Eventual consistency:最终一致性,最终整个系统(时间和系统的要求有关)看到的数据是一致的

在BASE中,强调可用性的同时,引入了最终一致性这个概念,不像ACID,并不需要每个事务都是一致的,只需要整个系统经过一定时间后最终达到是一致的。比如Amazon的卖书系统,也许在卖的过程中,每个用户看到的库存数是不一样的,但最终买完后,库存数都为0。再比如SNS网络中,C更新状态,A也许可以1分钟才看到,而B甚至5分钟后才看到,但最终大家都可以看到这个更新。

在数据存储方面,非关系型数据库提出另一种理念,例如,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,用户可以根据需要去添加自己需要的字段,这样,为了获取用户的不同信息,不需要像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。依据结构化方法以及应用场合的不同,主要分为以下几类:

  • 面向高性能并发读写的key-value数据库:key-value数据库的主要特点即使具有极高的并发读写性能,Redis,Tokyo Cabinet,Flare就是这类的代表
  • 面向海量数据访问的面向文档数据库:这类数据库的特点是,可以在海量的数据中快速的查询数据,典型代表为MongoDB以及CouchDB
  • 面向可扩展性的分布式数据库:这类数据库想解决的问题就是传统数据库存在可扩展性上的缺陷,这类数据库可以适应数据量的增加以及数据结构的变化

对比

关系型数据库的最大特点就是事务的一致性:传统的关系型数据库读写操作都是事务的,具有ACID的特点,这个特性使得关系型数据库可以用于几乎所有对一致性有要求的系统中,如典型的银行系统。Web应用如facebook、微博等,对并发读写要求很高,对一致性要求并不高,非关系型数据库应运而生,由于不可能用一种数据结构化存储应付所有的新的需求,因此,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库这员老将(待确定,Nosql是否适合永久存储?)。

特性 优点 缺点
关系型数据库SQLite、Oracle、mysql 1)关系型数据库,是指采用了关系模型来组织数据的数据库2)关系型数据库的最大特点就是事务的一致性3)简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织 1)容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解2)使用方便:通用的SQL语言使得操作关系型数据库非常方便3)易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率4)支持SQL,可用于复杂的查询 1)为了维护一致性所付出的巨大代价就是其读写性能比较差2)固定的表结构,扩展性差3)难以满足高并发读写需求4)海量数据的读写效率低
非关系型数据库MongoDb、redis、Hbase 1)使用键值对存储数据2)分布式3)一般不支持ACID特性4)非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合 1)无需经过sql层的解析,读写性能很高2)基于键值对,数据没有耦合性,容易扩展3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型 1)不提供sql支持,学习和使用成本较高2)无事务处理,附加功能bi和报表等支持也不好;
2016-12-11 20:57 10 数据仓库 数据建模
Comments
Write a Comment