目录
1、简介
关系型数据库,其基本模型都来自基本的关系数据模型,大多数实现了SQL语言支持、事务机制、完整性保护等功能,不同数据库产品的设计方案也是相通或相近的。
NoSQL数据库则有很大不同,NoSQL一词可以看作各种分布式非关系型数据库的统称,并没有一个统一的模式。但NoSQL在数据模型上的一个共同点是不会采用传统意义上的行列结构。eg:嵌套的列结构(不满足原子性要求)、没有固定的列名和值域(不满足域完整性要求),不会预先定义表结构等。
常见的NoSQL数据模型具有以下几种形式:键值模式、列存储模式、文档存储模式和图存储模式。其中键值模式、列存储模式和文档存储模式的应用更加广泛,通常被称为面向聚合的数据模型,以区别于传统面向关系的数据模型。
注意:NoSQL是为了满足大数场景下的数据分布式查询与管理而产生的,和关系型数据库相比,NoSQL数据库在通用性、事务能力上都存在较大差距,但在分布式部署和大数据检索等方面具有优势。因此NoSQL不能看作是关系型数据库的替代品,并且无论何种NoSQL数据模型,都不能看作是“更好”的模型,其优势和劣势都是客观存在,需要根据业务场景和需求扬长避短,灵活运用。
2、键值对存储模式
2.1 简介
- 键值对模式也就是 Key-Value 模式。
- 数据表中的每个实际行只具有行建(Key)和数值(Value)两个基本内容。
- 值可以看作是一个单独的存储区域,可能是任何的类型,甚至是数组。在实际的软件实现中,可能会存储时间戳、列名等信息,也就是说,每个值可能都有不同的列名,不同键所对应的值,可能是完全不同的内容(完全不同的列)。因此,表的结构(表中包含的列、其值域等)无法提前设计好,也就是说这种键值模式的表是无结构的。
- 在应用时,相同行建的行被看作属于同一个逻辑上的行(类似于元组的概念)。
2.2 特点
- 键值模式适合按照键对数据进行快速定位,还可以通过对键进行排序和分区,以实现更快速的数据定位。
- 如果对值内容进行查找,则需要进行全表遍历,在大数据场景下效率低。
- 如果将键值模式部署在分布式集群上,可以根据键将数据分块步数在不同节点上,这样可以实现并行的数据遍历,查找效率会有明显提升。
- 如果进行关系型数据库中很常见的关联查询,则需要在键值数据库之上通过复杂编程实现,受制于大数据场景下的数据总量,效率低。
- 键值模式的NoSQL数据库通常不支持对值建立索引,因为值对应的列不确定,且在分布式情况下进行增删改查时,需要对索引进行维护和重建,考虑到排序后的键就是天然的一级索引,值的索引可以看作是二级索引,该问题较难解决。
2.3 实例
redis、levelDB等,还有Java中的哈希表这种结构,都是键值存储结构。
3、文档式存储模式
3.1 简介
文档式存储模式和键值存储模式具有一定的相似性,但其值一般为半结构化内容,需要通过某种半结构化标记语言进行描述,例如通过JSON或XML等方式来组织其值,键值存储一般不关心你值的结构。不同的元组可能对应的文档结构可能完全不同。文档中还可能会嵌套文档,以及出现不定长的重复属性,因此文档式结构也是无法预先定义结构的。
3.2 特点
- 和键值模式相比,文档式存储模式强调可以通过关键词查询文档内部的结构,而非只通过键来进行检索。
- 由于文档允许嵌套,因此可以将传统关系型数据库中需要Join查询的字段整合为一个文档,这种做法理论上会增加存储开销,但是会提高查询效率。在分布式系统中,Join查询的开销较大,文档式存储的嵌套结构的优势更加明显。
- 文档式存储模式通常会采用JSON(JavaScript Object Notation)或类似JSON的方式描述数据。一些基于列族模式的NoSQL也会利用JSON描述应用层数据。
3.3 实例
MongoDB 和 CouchDB 等
4、列式存储模式
4.1 简介
列存储模式也可以称为面向列的存储模式,以区别于关系型数据库中面向行的存储模式,这种存储模式主要用在OLAP、数据仓库等场合。
4.2 特点
- 面向列的存储模式中,属于不同列或列族的数据存储在不同的文件中,这些文件可以分布在不同的位置上,甚至在不同节点上。
- 执行某些查询时,列存储模式更加有效,例如,查询某个列的前1000行数据,此时数据库只需要读取相应列的存储文件即可,不相关的列则不需要检索。该方式对于检索行列数超大的稀疏宽表非常有效。但如果数据量较小,则并不具备明显优势。
- 在面向行的模式中,数据表中的每一行,所涉及的列或字段都是相同且不可分的。但在面向列的存储中,每一行所涉及的列都可以是不同的。
- 列存储模式一般仍是不预先定义结构的,这一点和键值存储类似。值得注意的是,列存储模式可能会通过“列族”的概念来组织数据,列族是若干列的集合,其数量和名称都是随意的。
4.3 实例
Big Table 和 Dremal,C-Store,还有Cassandra和Hbase也运用了列存储模式。
5、图存储模式
5.1 简介
图存储模式来源于图论中的拓扑学。图存储模式是一种专门存储节点和边以及节点之间的连线关系的拓扑存储方法。节点和边都存在描述参数,边是矢量,即有方向的,可能是单向或双向的。例如,“李明的老师是张老师”,这个信息,可以将“李明”和“张老师”理解为节点,这两个节点存在一个单向关系“x是y的老师”。这种拓扑关系类似于E-R图,但在图存储模式中,“关系”和节点本身就是数据,而在关系型数据库中,“关系”和E-R图描述的是数据结构。
5.2 特点
- 在图存储模式中,每个节点都需要有指向其所有相连对象的指针,以实现快速的路由。因此图存储模式比传统二维表模式更容易实现路径的检索和处理。
- 由于图数据库中的节点都是相互连接的,因此对数据进行分片和分布式部署较为困难。
5.3 实例
Neo4J、Apache Spark 的 GraphX 模块等。
参考:《NoSQL数据库的基本原理》