SQL还是NoSQL?

作者: Wilfried Lemahieu, Bart Baesens,  Seppe vanden Broucke

翻译: 朱兵 

关系数据库管理系统(RDBMS)非常关注数据一致性和数据库模式的遵从性。新数据和对现有数据的修正一定要满足现有数据库模式中对数据类型和参照完整性的限制,否则他们不会被系统所接受。RDBMS协调其事务的方式时需确保整个数据库始终保持一致,即众所周知的ACID属性:原子性,一致性,隔离性和持久性。一致性通常是理想属性之一,人通常不希望错误数据进入自己的数据系统,例如不希望转移资金的中途,两个账户中只有一个进行了更新。

然而,这种对一致性的关注有时可能会成为负担,因为它有时会引起不必要的开销并阻碍可扩展性和灵活性。在对中小型数据集执行密集读写操作或对有限数量的并发事务进行批处理过程时,RDBMS是最优选择。当数据量或并行事务数量增加时,通常可以通过垂直扩展来增加容量,即增加数据库服务器的存储容量和/或增加CPU功率,但垂直扩展受到硬件限制。因此,需要将多个DBMS服务器排列在一个群集中。通过水平扩展来进一步地增加容量,群集中的各个节点可以相互平衡工作负载,水平扩展通过向群集添加节点来实现,而不是扩展单个节点的容量。这种集群结构是应对大数据(分析)、云计算和各种响应式Web应用程序等近期产生的巨大需求的必要先决条件。它既能满足单台服务器无法实现的性能要求,又能保证可用性,这种情况下,数据复制到多个节点,若一个节点发生故障,其他节点将接管其工作负载。

但是,RDBMS并不适用水平扩展。他们管理事务的方法以及他们始终保持数据一致的强制要求随着节点数量的增加引发了大量的协调开销。此外,大数据背景下丰富的查询功能可能矫枉过正,应用程序仅需要高容量来“放置”和“获取”数据项,而不需要复杂的数据相互关系和选择标准。而且大数据通常关注的是半结构化数据或结构易变的数据(例如,传感器数据、图像、音频数据等),然而RDBMS的僵化的数据库结构导致了不灵活性。

上述的一切并不意味着关系数据库即将过时。但几乎任何数据和处理环境都使用RDBMS的“一刀切”时代似乎已经结束。在存储中型高度结构化数据时,RDMS由于一致性和丰富的查询功能将仍是一种选择。但对于更注重可扩展性和可用性的海量灵活数据结构,则需要其他的数据库系统来存储。这种需求使得NoSQL数据库应运而生。

NoSQL应运而生

在过去十年里,“NoSQL”一词涵盖很多意义,现在这个术语涉及到许多含义和系统。现有NoSQL概念主要指以表格关系以外的其他格式存储和操作数据的数据库。其中一些非关系数据库实际上提供了近似于SQL的查询语言工具, 因此“NoSQL”应该更恰当地被称为NoREL。基于这些原因,人们已经改变了NoSQL的原始含义以表示“不仅是SQL“或”非关系”等含义而不是“非SQL”.

NoSQL数据库与早在20世纪70年代就存在的其他非关系系统有何不同?对非关系数据库重拾兴趣源于21世纪初期的Web 2.0公司。在这一时期,Facebook、谷歌和亚马逊等新兴的网络公司越来越多地面临着大量需要处理的数据,而且这些数据通常受时效限制。例如,即时Google搜索查询,或者成千上万用户对亚马逊产品页面或Facebook文件的即时访问。

为满足这些需求而开发的系统通常植根于开源社区,因此具有非常多样化的特性。然而,他们的共同点是都试图在某种程度上避免RDBMS的缺点。大多数系统通过在数据库节点集群上分布数据来实现线性水平可伸缩性,以同时实现性能(并行性和负载平衡)和可用性(数据复制和故障管理),而这通常会牺牲一定程度数据一致性。这里使用最终一致性,即数据以及相同数据项的相应副本在每次事务处理后都会保持一致,但不保证连续一致性。

关系数据模型已被部分建模范式弃用,这些范式通常不那么固化并且能够更好地处理快速演变的数据结构。NoSQL的应用程序编程接口API和查询机制通常比关系设置简单得多。下图提供了NoSQL数据库和关系系统数据库典型特征的详细比较。需要注意的是, NoSQL数据库有很多类别,而且即使同一类别的关系数据库,其特征也可能非常多样,没有任何单一的NoSQL系统会具有所有的属性。

表1: NoSQL数据库和关系数据库特征比较

关系数据库 NoSQL 数据库
数据范式 关系表 基于键值(元组)的
基于文档的
基于列的
基于图形的基于XML和对象的
其它:时间序列、 概率等
分布 单节点或分布式 分布式
可扩展性 垂直扩展,难以水平扩展 易于水平扩展 ,易于数据复制
开放性 封闭或开源 开源
模式 模式驱动 无模式和灵活模式
查询语言 SQL 作为查询语言 没有或有简单查询功能,或特殊用途语言
事务机制 ACID: 原子性、一致性、隔离性、持久性 BASE: 基本可用性、无连接、最终一致性
特征集 许多特征 (触发器、视图、存储过程等) 简单 API
数据量 能处理正常大小数据集 能处理大规模数据和非常高的读/写请求频率

然而,虽然NoSQL很流行,但是也应该考虑到NoSQL数据存储层的局限性,大多数NoSQL的应用尚未证明它们的真正价值,大多数系统都非常年轻和处于正在开发状态。大多数应用都牺牲了ACID的关注点,更倾向于保持最终一致性。而且缺乏关系支持使得表达某些查询或聚合功能特别困难,虽然也提供了map-reduce接口作为替代方案,但是增加了学习和使用的难度。

由于RDBMS对事务性、持久性和可管理性提供了强有力的支持,很多早期切换使用NoSQL的人都吃了不少苦头。例如,FreeBSD的维护人员怒怼MongoDB缺乏磁盘一致性支持;Digg从MySQL切换到NoSQL数据库的Cassandra后一直处于挣扎状态;而Twitter也在面临相似问题后最终还是坚持使用了MySQL集群; HealthCare.gov由于其IT团队无法适应NoSQL而惨败。

将RDBMS和NoSQL数据库之间的选择变成一致性和完整性或者可扩展性和灵活性之间的选择是一种过度的简化。市场上的NoSQL系统非常多样化。尽管如此,这些选择标准在决定是否采用NoSQL路线时仍然会起作用。我们看到许多NoSQL厂商重新关注鲁棒性和耐用性。我们还观察到传统的RDBMS厂商可以让你在传统RDBMS内部实现无模式、可扩展的数据存储同时能够存储嵌套的半结构化文档,这些多是大多数NoSQL数据库的卖点,特别是那些文档储存NoSQL数据库。一些厂商已经采用新术语“NewSQL”来描述现代关系数据库管理系统,该系统旨在将NoSQL系统的可扩展性能和灵活性与传统DBMS系统的鲁棒性相结合。

预计未来除了专门的小型数据库管理系统外,采用这种“混合系统”将成为趋势。在这种情况下,NoSQL让用户认识到,关系型系统不再适用于所有,应该找到合适的工具来取代。例如,用于“超关系”数据的图形数据库,它使得公民与其记录本身紧密相连,而不是将其分开存储。图形数据库在处理对象之间的许多嵌套或层级关系时,以直接的方式表达复杂的查询。下表通过总结传统RDBMS,NoSQL和NewSQL之间的差异来总结本文。

表2: 不同数据库比较

传统 SQL RDBMSs 数据库 NoSQL 混合系统NewSQL
关系型
SQL 否,虽然可以附带自己的查询语言
列储存
可扩展性 有限
一致性模型 最终一致, 尽管努力加强一致性 强一致性
BASE
处理大数据
无模式 否,虽然可以存储和查询自由结构字段

欲了解更多信息,请登陆网站www.pdbmbook.comc查看我的新书《数据库管理原理:数据存储、管理和分析实用指南》,观看免费该书配套频道:https://www.youtube.com/watch?v=o36Z_OqC2ac&list=PLdQddgMBv5zHcEN9RrhADq3CBColhY2hl

转载本文请联系原作者获取授权

转载请注明出处及作者译者信息