1.关系型数据库
关系型数据库,是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
关系模型中常用的概念:
关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名
元组:可以理解为二维表中的一行,在数据库中经常被称为记录
属性:可以理解为二维表中的一列,在数据库中经常被称为字段
域:属性的取值范围,也就是数据库中某一列的取值限制
关键字:一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成
关系模式:指对关系的描述。其格式为:关系名(属性1,属性2,......,属性N),在数据库中称为表结构。
(1)特点
-数据关系模型基于关系模型,结构化存储,完整性约束。
-基于二维表及其之间的联系,需要连接、并、交、差、除等数据操作。
-采用结构化的查询语言(SQL)做数据读写。
-操作需要数据的一致性,需要事务甚至是强一致性。
(2)优点
-保持数据的一致性(事务处理)
-可以进行join等复杂查询
-通用化,技术成熟
(3)缺点
-数据读写必须经过sql解析,大量数据、高并发下读写性能不足
-对数据做读写,或修改数据结构时需要加锁,影响并发操作
-无法适应非结构化存储
-扩展困难
-昂贵、复杂
事务具有4个基本特征(ACID),分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration)
原子性:事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一。全部执行成功或全部执行失败。任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。
一致性:事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱。
隔离性:事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。
持久性:事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态
2.NoSQL数据库
NOSQL数据库不支持SQL语法,存储结构都是kv形式(keyvalue),NOSQL的数据库没有一种通用语言,每种NOSQL都有自己的语法和api,以及擅长的业务和场景。
(1)特点
-非结构化的存储。
-基于多维关系模型。
-具有特有的使用场景。
(2)优点
-高并发,大数据下读写能力较强。
-基本支持分布式,易于扩展,可伸缩。
-简单,弱结构化存储。
(3)缺点
-join等复杂操作能力较弱。
-事务支持较弱。
-通用性差。
-无完整约束,复杂业务场景支持较差。
(4)NOSQL的种类:
将典型的NoSQL划分为4种类型,分别是键值数据库、列式数据库、文档数据库和图形数据库。
键值数据库:键值数据库起源于Amazon开发的Dynamo系统,可以把它理解为一个分布式的Hashmap,支持SET/GET元操作。
它使用一个哈希表,表中的Key(键)用来定位Value(值),即存储和检索具体的Value。数据库不能对Value进行索引和查询,只能通过Key进行查询。Value可以用来存储任意类型的数据,包括整型、字符型、数组、对象等。在存在大量写操作的情况下,键值数据库可以比关系数据库有明显的性能优势,这是因为关系型数据库需要建立索引来加速查询,当存在大量写操作时,索引会发生频繁更新,从而会产生高昂的索引维护代价。键值数据库具有良好的伸缩性,理论上讲可以实现数据量的无限扩容。
键值数据库可以进一步划分为内存键值数据库和持久化键值数据库。内存键值数据库把数据保存在内存中,如Memcached和Redis。持久化键值数据库把数据保存在磁盘中,如BerkeleyDB、Voldmort和Riak。
键值数据库也有自身的局限性,主要是条件查询效率较低。如果只对部分值进行查询或更新,效率会比较低下。在使用键值数据库时,应该尽量避免多表关联查询。此外,键值数据库在发生故障时不支持回滚操作,所以无法支持事务。
相关产品:Memcached、Redis、BerkeleyDB、Voldmort、Riak、SimpleDB、Chordless、Scalaris等。
键值数据库(常见的Redis、Memcached)是一类以轻量级结合内存处理为的NoSQL数据库。轻量级指的是它的数据存储结构简单,数据库规模小,其以内存处理为主的处理说明该类数据的设计目的是为了更快地实现对大数据的处理,所以说键值数据库的设计是以更高数据处理速度为第一目标。
键值数据库中只有键(Key)和值(Value)两列,其中键起到唯一索引的作用,用于确保一个键值结构中数据记录的唯一性,值是对应某个键的数据,该数据通过键来获取,值的数据类型是任意的。键值数据库中键和值的组合就形成了键值对。键值数据库中由若干键值对构成的集合就形成了命名空间。
2.列式数据库
列式数据库起源于Google的BigTable,其数据模型可以看作是一个每行列数可变的数据表。列式数据库能够在其他列不受影响的情况下,轻松添加一列,但是如果要添加一条记录时就需要访问所有表,所以行式数据库要比列式数据库更适合联机事务处理过程(OLTP),因为OLTP要频繁地进行记录的添加或修改。
列式数据库更适合执行分析操作,如进行汇总或计数。实际交易的事务,如销售类,通常会选择行式数据库。列式数据库采用高级查询执行技术,以简化的方法处理列块(称为“批处理”),从而减少了CPU使用率。
相关产品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS
列族数据库(最常见Cassandra、HBase)以列为单位存储数据。列是列族数据库用于存放单个数值的数据结构,列的每个值都附带时间戳,通过它可以区分值的不同版本。行键用来唯一确定列族数据库中不同行数据区别的标识符。列族是由若干个列所构成的一个集合。
3.文档数据库
文档数据库是通过键来定位一个文档的,所以是键值数据库的一种衍生品。在文档数据库中,文档是数据库的最小单位。文档数据库可以使用模式来指定某个文档结构。
文档数据库是NoSQL数据库类型中出现得最自然的类型,因为它们是按照日常文档的存储来设计的,并且允许对这些数据进行复杂的查询和计算。
尽管每一种文档数据库的部署各有不同,但是大都假定文档以某种标准化格式进行封装,并对数据进行加密。文档格式包括XML、YAML、JSON和BSON等,也可以使用二进制格式,如PDF、MicrosoftOffice文档等。一个文档可以包含复杂的数据结构,并且不需要采用特定的数据模式,每个文档可以具有完全不同的结构。
文档数据库既可以根据键来构建索引,也可以基于文档内容来构建索引。基于文档内容的索引和查询能力是文档数据库不同于键值数据库的主要方面,因为在键值数据库中,值对数据库是透明不可见的,不能基于值构建索引。
文档数据库主要用于存储和检索文档数据,非常适合那些把输入数据表示成文档的应用。从关系型数据库存储方式的角度来看,每一个事物都应该存储一次,并且通过外键进行连接,而文件存储不关心规范化,只要数据存储在一个有意义的结构中就可以。
相关产品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit
文档数据库(最常见MongoDB)是键值数据库的一种衍生品。在文档数据库中,文档是数据库的最小单位。存储结构基本形式为键值对,具体由数据和格式组成;数据分为键和值两部分,格式根据数据种类的不同而有所区别,文档数据库的键和值存放在一个字段中。文档是键值对所构成的有序集。集合是由若干条文档构成的对象。文档数据库包含了若干个集合。
4.图形数据库
图形数据库以图论为基础,用图来表示一个对象集合,包括顶点及连接顶点的边。图形数据库使用图作为数据模型来存储数据,可以高效地存储不同顶点之间的关系。
图形数据库是NoSQL数据库类型中最复杂的一个,旨在以高效的方式存储实体之间的关系。图形数据库适用于高度相互关联的数据,可以高效地处理实体间的关系,尤其适合于社交网络、依赖分析、模式识别、推荐系统、路径寻找、科学论文引用,以及资本资产集群等场景。
相关产品:Neo4J、OrientDB、InfoGrid、GraphDB
在图数据库(常见Neon4JGraphDB)中,图是包含节点、边和属性的数据结构,包括有向图、无向图、流动网络图、二分图、多重图、加权图和树图等。节点表示一个事务或一个实体;属性描述节点及其相关信息;边用于连接各节点的线,包括有向边和无向边。
缺点:无法存储结构化信息、条件查询效率较低
使用者:百度云(Redis)、GitHub(Riak)、BestBuy(Riak)、Twitter(Ridis和Memcached)
2列族数据库
相关产品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS
应用:分布式数据存储与管理
优点:查找速度快、可扩展性强、容易进行分布式扩展、复杂性低
使用者:Ebay(Cassandra)、Instagram(Cassandra)、NASA(Cassandra)、Facebook(HBase)
3文档数据库
相关产品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit
应用:存储、索引并管理面向文档的数据或者类似的半结构化数据
优点:性能好、灵活性高、复杂性低、数据结构灵活
缺点:缺乏统一的查询语言
使用者:百度云数据库(MongoDB)、SAP(MongoDB)
4图形数据库
相关产品:Neo4J、OrientDB、InfoGrid、GraphDB
应用:大量复杂、互连接、低结构化的图结构场合,如社交网络、推荐系统等
优点:灵活性高、支持复杂的图形算法、可用于构建复杂的关系图谱
缺点:复杂性高、只能支持一定的数据规模
使用者:Adobe(Neo4J)、Cisco(Neo4J)、T-Mobile(Neo4J)