NoSql 是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称。它所采用的数据模型并非关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。
当应用场合需要简单的数据模型、灵活性的 IT 系统、较高的数据库性能和较低的数据库一致性时,NoSql 数据库是一个很好的选择。NoSql 数据库通常有以下3个特点:
比较标准 | 关系数据库 | NoSql | 备注 |
---|---|---|---|
数据库原理 | 完全支持 | 部分支持 | 关系数据库有关系代数理论作为基础,但是 NoSql 没有统一的理论基础 |
数据规模 | 大 | 超大 | 关系数据库很难实现横向扩展,NoSql 可以很容易通过添加更多设备支持更大规模的数据 |
数据库模型 | 固定 | 灵活 | 关系数据库需要定义数据库模式,严格遵守数据定义和相关约束条件;NoSql 不存在数据库模式,可以灵活定义并存储各种不同类型的数据 |
查询效率 | 快 | 实现高效的简单查询,但是复杂查询的效率不尽人意 | 关系数据库借助索引机制可以实现快速查询;很多 NoSql 数据库没有面向复杂查询的索引,及时使用 MapReduce 加速查询,性能方面仍不如关系数据库 |
一致性 | 强一致性 | 弱一致性 | 关系数据库严格遵守事务 ACID 模型,保证事务的强一致性;很多 NoSql 数据库放松了对 ACID 四性的要求 |
数据完整性 | 容易实现 | 很难实现 | 任何一个数据库都可以实现数据完整性(包括实体完整性、参照完整性和自定义完整性),但是 NoSql 数据库无法实现 |
扩展性 | 一般 | 好 | 关系数据库很难实现横向扩展,纵向扩展的控制键也比较有限;NoSql 很容易实现横向扩展 |
可用性 | 好 | 很好 | \ |
标准化 | 是 | 否 | 关系数据库已经标准化(SQL);NoSql 还没有行业标准 |
技术支持 | 高 | 低 | 关系数据库已经非常成熟,很多厂商可以提供很好的技术支持;NoSql 在技术支持方面还在起步阶段 |
可维护性 | 复杂 | 复杂 | 关系数据库需要专门的数据库管理员维护;NoSql 数据库虽然没有关系数据库复杂,但也难以维护 |
通过上述比较,可以看出两者都有各自的目标用户群体和市场空间,不存在一个完全取代另一个的问题。
NoSql 数据库虽然数量众多,但是归结起来,典型的 NoSql 数据库通常包括简直数据库、列族数据库、文档数据库和图数数据库。
键值数据库会使用一个哈希表,这个表中有一个特定的 Key 和一个指针指向特定的 Value。key 可以用来定位 value,即存储和检索具体的 Value。Value 对数据库而言是透明不可见的,不能对 Value 进行索引和查询,只能通过 Key 进行查询。Value 可以用来存储任意类型的数据。
键值数据库可以进一步划分为 内存键值数据库 和 持久化键值数据库 。前者吧数据保存在内存中,后者吧数据保存在磁盘。
项目 | 描述 |
---|---|
相关产品 | Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached |
数据模型 | 键/值对 |
典型应用 | 内容缓存,如会话、配置文件、参数、购物车等 |
优点 | 扩展性好、灵活性好、大量写操作时性能高 |
缺点 | 无法存储结构化信息、条件查询效率较低 |
使用者 | GitHub(Riak)、Twitter(Redis 和 Memcached)、StackOverFlow(Redis) |
列族数据库一般采用列族数据模型,数据库由多个行构成,每行数据包含多个列族,不同的行可以有不同的列族,属于同一列族的数据会被存放在一起。每行数据通过行键进行定位。
项目 | 描述 |
---|---|
相关产品 | BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PUNTS |
数据模型 | 列族 |
典型应用 | 分布式数据库存储于管理 |
优点 | 查找速度快、可扩展行强、容易进行分布式扩展、复杂性低 |
缺点 | 功能较少,大都不支持强事务一致性 |
使用者 | NASA(Cassandra)、Twitter(Cassandra and HBase)、Facebook(HBase)、Yaho!(HBase) |
文档数据库中,文档是数据库的最小单位。虽然每一种文档数据库的部署都有所不同,但是大都假定文档以某种标准化格式封装并对数据进行加密,同时用多种格式进行解码。文芳数据库通过键来定位一个文档,可以看成键值数据库的衍生品,但是前者要比后者的查询效率高。
文档数据库既可以根据键(Key)来构建索引,也可以基于文档内容来构建索引(这是文档数据库不同于键值数据库的地方)。
项目 | 描述 |
---|---|
相关产品 | CouchDB、MongoDB、Terrastore、ThruDB、RavenDB、SisoDB、RaptorDB、CloudKit、Perservere、Jackrabbit |
数据模型 | 版本化的文档 |
典型应用 | 存储、检索并管理面向文档的数据或者类似的半结构化数据 |
优点 | 性能好、灵活性高、复杂性低、数据结构灵活 |
缺点 | 缺乏统一的查询语法 |
使用者 | 百度云数据库(MongoDB)、SAP(MongoDB)、Codecademy(MongoDB)、NBC News(RavenDB) |
图数据库以图论为基础,一个图是一个数学概念,用来表示一个对象集合,包括顶点以及连接顶点的边。图数据库使用图作为数据模型来存储数据,可以高效地存储不同顶点之间的关系。
图数据库专门用于处理具有高度相互关联关系的数据,可以高效地处理实体之间的关系,比较适合于社交网络、模式识别、依赖分析、推荐系统以及罗静寸照等问题。
项目 | 描述 |
---|---|
相关产品 | Neo4J、OrientDB、InfoGrid、Infinite Graph、GraphDB |
数据模型 | 图结构 |
典型应用 | 应用于大量复杂、互连接、低结构化的图数据结构场合 |
优点 | 灵活性高、支持复杂的图算法、可用于构建复杂的关系图谱 |
缺点 | 复杂性高、只能支持一定的数据规模 |
使用者 | Adobe(Neo4J)、Cisco(Neo4J)、T-Mobile(Neo4J) |
所谓 CAP 指的是:
从上图可以看出,一个分布式系统不可能同时满足三个需求,最多只能同时满足其中 2 个。
首先先来回顾一下关系数据库的 ACID:
关系数据库系统设计了复杂的事务管理机制来保证事务在执行过程中严格满足 ACID 四性要求。但是,NoSql 数据库通常应用于 Web 2.0 网站等场景中,对数据一致性的要求并不是很高,强调系统的高可用性,适当牺牲了一致性或分区容忍性。BASE 的基本思想就是在这个基础上发展起来的,它牺牲了高一致性,从而获得可用性或可靠性。
BASE 的基本含义是 基本可用、软状态 和 最终一致性。
1. 基本可用
基本可用是指一个分布式系统的一部分发生问题变得不可用时,其他部分仍然可以正常使用,也就是允许分区失败的情形出现。
2. 软状态
“软状态”是与“硬状态”相对应的一种提法。数据库保存的数据是“硬状态”时,可以保证数据一致性,即保证数据一直是正确的。“软状态”是指状态可以有一段时间不同步,具有一定的滞后性。
3. 最终一致性
一致性的类型包括强一致性和弱一致性,二者的主要区别在于宝并发的数据访问操作下,后续操作是否能够获取最新的数据。
对于强一致性而言,当执行完一次更新操作后,后续的其他读写操作就可以保证读到更新后的最新数据;
反之,如果不能保证后续访问读到的都是更新后的最新数据,那么就是弱一致性。
最终一致性时弱一致性的一种特例,允许后续访问操作可以暂时读不到更新后的数据,但是经过一段时间后,必须最终读到更细后的数据。
讨论一致性,需要从客户端和服务端两个角度来考虑。从服务端来看,一致性是指更新如果复制分布到整个系统,以保证数据最终一致。从客户端来看,一致性主要指的是高并发的数据访问操作下,后续操作是否能够获取到最新的数据。
最终一致性,只要经过一段时间后能够访问到更新后的数据即可。也就是说,如果一个操作 OP 往分布式存储系统中写入一个值,遵循最终一致性的系统可以保证:如果后续访问发生之前没有其他写操作去更新这个值的话,最终所有后续的访问都可以读取到操作 OP 写入的最新值。
从 OP 操作完成到后续访问可以最终读取到 OP 写入的最新值,这之间的时间间隔称为“不一致性窗口”
NoSQL 数据库提供了良好的扩展性和灵活性,很好地弥补了传统关系数据库的缺陷,但是它也存在自己的不足之处,不具备高度结构化查询等特性,查询效率尤其是复杂查询方面不如关系数据库,而且不支持事务 ACID 四性。
在这个背景下,NewSQL 数据库开始逐渐升温。NewSQL 是对各种新的可扩展、高性能数据库的简称,这列数据库不仅具有 NoSQL 对海量数据的存储管理能力,还保持了传统数据库支持 ACID 和 SQL 等特性。不同的 NewSQL 数据库的内部结构差异很大,但是它们有两个显著的共同特点:都支持关系数据模型;都使用 SQL 作为其主要的接口。