关系型数据库

关系型数据库(Relational database),是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。

非关系型数据库

非关系型数据库(NoSQL),有时也被称为Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

NoSQL的优缺点

优点 缺点
高可拓展性 没有标准化
分布式计算 有限的查询功能(到目前为止)
低成本 最终一致是不直观的程序
架构的灵活性,半结构化数据
没有复杂的关系

常见NoSQL数据库

类型 代表 特点
列存储 Hbase、Cassandra、Hypertable 按列存储数据。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
文档存储 MongoDB、CouchDB 文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。
键值对存储 Tokyo Cabinet/Tyrant、Berkeley DB、MemcacheDB、Redis 可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)
图存储 Neo4J、FlockDB 图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。
对象存储 db4o、Versant 通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。
xml数据库 Berkeley DB XML、BaseX 高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

ACID原则

事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元,狭义上的事务特指数据库事务。一方面,事务为多个应用程序并发访问数据库提供一个隔离方法,防止彼此的操作互相干扰。另一方面,事务为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持数据一致性的办法关系型数据库遵循ACID原则,它有如下四个特性:

  • A (Atomicity) 原子性
    原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
    比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。

  • C (Consistency) 一致性
    一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
    例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。

  • I (Isolation) 独立性
    所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。
    比如现在有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。

  • D (Durability) 持久性
    持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

    在标准的SQL规范中,定义了4个事务隔离级别:

    • 读未提交(Read Uncommited):允许读取到其他事务未提交的数据,其事务隔离级别最低。
    • 读已提交(Read Commited):允许读取到其他事务已提交的数据。
    • 可重复读(Repeatable Read):事务处理过程中,多次读取同一个数据,其值都和事务开始时刻是一致的。
    • 串行化(Serializable):最严格的事务隔离级别,要求所有事务被串行执行,即事务只能按顺序一个接一个地处理,不能并发执行。

CAP定理

在计算机科学中, CAP定理(CAP theorem), 又被称作布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) :所有节点在同一时间具有相同的数据。
  • 可用性(Availability) :指系统提供的服务必须一直处于可用的状态,每一个操作请求总是能够在指定时间(即响应时间)内返回结果,不管成功或者失败。
  • 分区容错(Partition tolerance) :分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证继续运作,除非是整个网络环境都发送了故障。

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

BASE三要素

BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:

  • 基本可用(Basically Availble) :指分布式系统在出现不可预知故障时,允许损失部分可用性。不等价于系统不可用。
  • 软状态/弱状态(Soft-state) :指允许系统中数据存在中间状态,并认为该中间状态的存在不影响系统的整体可用性。即允许系统在不同节点的数据副本之间进行数据同步的过程中存在延时。
  • 最终一致性(Eventual Consistency):强调系统中所有数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。并不需要实时保证系统数据的强一致性。

    强一致性:各节点数据保持实时的一致性,和全局时钟下的顺序一致。
    顺序一致性:各节点数据保持实时的一致性,不需要和全局时钟下的顺序一致,错的话一起错,对的话一起对。
    最终一致性:允许各节点数据有一段时间延迟,最终保持一致。
    弱一致性:即使过了一段时间延迟,也不保证一致。

RDBMS vs NoSQL

RDBMS NoSQL
高度组织结构化数据 非结构化和不可预知的数据
结构化查询语言SQL 没有声明性查询语言,不仅仅是SQL
数据和关系都存储在单独的表 键值对存储,列存储,文档存储,图形数据库
数据操作语言,数据定义语言 没有预定义的模式
强一致性 最终一致性
ACID原则 CAP定理
- 高性能,高可用性和可伸缩性

参考地址:https://www.runoob.com/mongodb/nosql.html