NoSQL数据库原理(第2版·微课版)
上QQ阅读APP看书,第一时间看更新

1.1 数据库的相关概念

数据库(Database,DB)一般指数据的集合,也可以看作按照数据结构来存储和组织信息的软件容器或仓库。数据库及其管理软件构成了数据库管理系统(Database Management System,DBMS),实现数据的管理和使用等功能。数据库管理系统及其运行所需的软硬件环境、操作人员乃至手册文档等内容,构成一个完整体系,称为数据库系统(Database System,DBS)。

在更多的场景中,“数据库系统”和“数据库”均可以看作是对数据库管理系统的简称——例如一些数据库产品的官方网站,以及一些知名的公有云。本书提到的“关系型数据库”和“NoSQL数据库”,实际都是数据库管理系统的具体形式,用来管理具有不同特点的数据,以及用来支撑不同的业务逻辑等。

1.1.1 关系型数据库

一般来说,数据库会提供数据的定义、操纵、组织和维护、持久存储、管理功能,以及数据库的通信与交互接口、保护和控制等功能,具体包括以下功能。

(1)数据定义:提供数据定义语言(Data Definition Language,DDL),用于建立、修改数据库的库、表结构或模式,将结构或模式信息存储在数据字典(Data Dictionary)之中。

(2)数据操纵:提供数据操纵语言(Data Manipulation Language,DML),用于增加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)数据(合称CRUD操作)。

(3)数据的持久存储、组织和维护、管理:能够分类组织、存储和管理各种数据,可以实现数据的加载、转换、重构等工作;能够将大量数据进行持久化存储,能够监控数据库的性能。

(4)保护和控制:可以支持多用户对数据的并发控制,保护数据库的完整性、安全性,支持从故障和错误中恢复数据。

(5)通信与交互接口:可以实现高效存取数据(例如查询和修改数据),可以实现数据库与其他软件、数据库的通信和互操作等功能。

历史上第一批商用的数据库诞生于20世纪60年代,这些数据库一般基于层次模型或网状模型,例如IBM公司研发的基于网状模型的信息管理系统(Information Management System,IMS)等。这些数据库的出现,改变了过去采用人工方式或文件方式管理数据的落后方式,提高了数据管理的效率,实现了更强大的数据访问方法,以及提供了细粒度的数据定义和操纵方法,但这些系统的数据库需要使用者(通常是程序员)对数据格式具有深入的了解,且不支持高级语言,这使得数据操作的难度很大。

1970年,IBM公司圣何塞实验室的埃德加·弗兰克·科德(Edgar Frank Codd,1923—2003)发表了名为《大型共享数据库的数据关系模型》(“A Relational Model of Data for Large Shared Data Banks”)的论文,首次提出数据库的关系模型。科德认为:在基于关系模型的数据库系统中,使用者不需要关心数据的存储结构,只需要通过简单的、非过程化的高级语言,例如结构查询语言(Structure Query Language,SQL),就可以实现数据定义和操纵,这样大大简化了数据操作的方法,提高了数据操作的效率。为了实现这一目的,数据的存储将独立于硬件,呈现给用户的则是被称为“关系”的、由行和列组成的二维表结构,如图1-1所示。

图1-1 一个典型的关系表结构描述

上述关系模型一般包括关系数据结构、数据关系操作和数据完整性约束3个基本组成部分。

(1)在关系数据结构中,实体和实体间的联系都可以通过关系(即二维表)的方式来表示。用户可以通过实体-联系模型(Entity-Relationship Model)来描述这些内容。

(2)在数据关系操作中,用户可以通过关系代数中的并、交、差、除、投影、选择、笛卡儿积等方式完成对数据集(而不仅仅是单条记录)的操作。

(3)在数据完整性约束中,关系模型必须对实体完整性和参照完整性进行约束,数据库应当提供完整性的定义与检验机制。此外,用户还可以定义并检验与业务有关的完整性约束,这并非强制要求。

建立在关系模型基础上的数据库管理系统,称为关系型数据库管理系统(Relational Database Management System,RDBMS)。1976年,第一个商用关系数据库问世,随后涌现出Oracle公司的Oracle RDBMS、微软公司的SQL Server、IBM公司的Db2,以及开源的MySQL数据库等诸多优秀的关系型数据库产品。

早期的基于网状模型和层次模型的数据库被称为第一代数据库,关系型数据库则被称为第二代数据库系统。目前,关系型数据库的理论、相关技术和产品都趋于完善,但也仍在持续发展中,关系型数据库也是目前世界上应用最广泛的数据库之一,广泛应用在各行各业的信息系统当中。

关系型数据库一般还会提供对事务(Transaction)的支持。事务是指一组数据操作必须作为一个整体来执行,这一组操作要么全部完成,要么全部取消。关系型数据库中的事务正确执行,需要具备原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)4个特性,此外,关系型数据库需要提供事务的恢复、回滚、并发控制、死锁解决等功能。

1990年,美国的高级DBMS功能委员会提出了“第三代数据库系统”的概念,希望其以关系型数据库为基础,支持面向对象等特性,以及支持更多、更复杂的数据模型。第三代数据库系统没有统一的数据模型,存在多种技术路线和衍生产品,但在技术成熟度和产品影响力上都没达到关系型数据库的水平。

1.1.2 关系型数据库的瓶颈

随着各类互联网新业务的兴起,人们在工作和生活中利用数据的方式发生了很大改变。数据在互联网上产生之后,一般不会被删除或离线保存,而是会被在线使用和分享——例如人们可以查询到很久以前的新闻或微博,因而典型互联网业务的数据总量巨大,且保持持续增长。

2014年有资料显示:一天之内互联网能够产生的内容可以刻1.68亿张DVD,一天之内互联网能够发出2940亿封邮件,相当于美国邮政系统两年处理的纸质邮件数量。著名网站Facebook,每天有超过5亿个状态更新,2.5亿张以上的照片被上传……

通常情况下,在部署关系型数据库时,可以通过不断升级硬件配置的方法,来提高其数据处理能力,这种升级方法称为纵向扩展(Scale Up)。20世纪60年代,英特尔公司的创始人戈登·摩尔(Gordon Moore)断言:当价格不变时,集成电路上可容纳的元器件的数目,每隔18~24个月会增加一倍,性能也会提升一倍。因此,升级硬件配置的方法可以使关系型数据库的单机处理能力持续提升。但是近年来,随着摩尔定律逐步“失效”,计算机硬件更新的脚步放缓,计算机硬件的纵向扩展受到约束,难以应对互联网数据爆发式的增长。

有人提到:“古时候,人们用牛来拉圆木,当一头牛拉不动时,他们不会去培育更大的牛,而是会用更多的牛。”这种采用“更多的牛”的扩展方法称为横向扩展(Scale Out),即采用多台计算机组成集群,共同对数据进行存储、组织、管理和处理。这个集群应当有以下特征。

(1)能够对集群内的计算机及其计算存储资源进行统一的管理、调度和监控。

(2)能够在集群中对数据进行分散的存储和统一的管理。

(3)能够向集群指派任务,能够将任务并行化,使集群内的计算机可以分工协作、负载均衡。

(4)利用集群执行所需的数据查询和操作时,性能远超单独的高性能计算机。

(5)当集群中的少量计算机或局部网络出现故障(类似某一头牛病了)时,集群性能虽略有降低,但仍然可以保持功能的有效性,且数据不会丢失,即具有很强的分区容错性。

(6)可以用简单的方式部署集群、扩展集群(类似增加牛的数量),以及替换故障节点,即具有很强的可伸缩性。

然而关系型数据库由于关系模型、完整性约束和事务的强一致性等特点,导致其难以实现高效率、易横向扩展的分布式部署架构,并且关系模型、完整性约束和事务的强一致性等特点在典型互联网业务中并不能体现出优势。例如:在管理海量的页面访问日志时,并不需要严格保障数据的实体完整性和引用完整性。

1.1.3 NoSQL的诞生与发展

(1)NoSQL的诞生。

一些互联网公司着手研发(或改进)新型的、非关系型的数据库,这些数据库被统称为NoSQL数据库(以下简称为NoSQL),常见的NoSQL包括HBase、Cassandra和MongoDB等。

NoSQL并不是一个严谨的分类或定义。在20世纪90年代,曾经有一款不以SQL作为查询语言的关系型数据库叫作NoSQL,这显然和NoSQL当前的含义不同。之后在2009年的一个技术会议上,NoSQL被再次提出,其目的是为“设计新型数据库”这一主题加上一个简短响亮的口号,使“设计新型数据库”更容易在社交网络上推广。

因此NoSQL更多的是代表一个趋势,而非对新型数据库进行严谨的分类和定义。有人将NoSQL解释为“No More SQL”(不再需要SQL)或“Not Only SQL”(不限于SQL)等,但作为分类标准和定义来看,这些也都不算严谨,此外还应强调,此处的SQL代指关系型数据库,而非SQL语句。

(2)NoSQL的技术特点。

NoSQL数据库并没有统一的模型,通过对知名NoSQL系统的特点进行归纳,我们可以得出NoSQL的一般特点:其是集群部署的、非关系型的、无模式的数据库,以及通常是开源软件等。

集群部署,意味着NoSQL通常能通过横向扩展进行扩展,以支持更大的数据量,这是NoSQL的最大优势。大多数NoSQL系统都可以实现对分布式存储的巨大表格中的数据进行并发的实时查询,但跨表查询等复杂操作会变得困难。

非关系型和无模式意味着NoSQL打破了关系模型、打破了传统的完整性约束机制、弱化甚至取消了事务机制等,这些策略可以看作提高横向扩展能力的代价,但这种代价在互联网领域是可接受的,因为在互联网领域的很多应用场景下,例如社交网络,关系模型并不能很好地发挥优势。

此外,打破关系模型意味着NoSQL采用了差异化的数据组织和管理方式,这也使在关系型数据库中被广泛使用的SQL语句无法天然地应用在这些打破关系模型的数据库上,所以这些数据库只能“No SQL(无SQL)”,并提供自己的数据查询语言。

早期的NoSQL系统一般是开源(Open Source)免费的,或同时提供开源免费的社区版本和收费的商业版本,这可以看作强调开放和共享的“互联网精神”的体现。开源免费使这些软件更容易被推广和被尝试,这使NoSQL自诞生以来受到越来越多的关注——无论是在互联网领域还是传统行业中。

(3)NoSQL的发展现状。

一家名为DB-Engines的网站通过采集知名搜索引擎、社交网络和招聘网站的信息等方式,对全球数据库的流行度(Popularity)进行评价和排名,如图1-2所示。2022年2月的数据显示,该网站总共收录了383个数据库产品,涉及14个类型。其中关系型数据库为152个,其他各种类型的数据库为231个。

从网站提供的流行度排名来看,在2022年2月排名前20的数据库产品中,有12个为关系型数据库(“Database Model”为“Relational”),非关系数据库为8个。但表中标注了“Multi-model”的条目,表示该产品提供了多种模型,并不是单一模型的产品。

NoSQL和关系型数据库可以看作互补关系,可以在不同的应用场景发挥各自的优势。在不限定场景的情况下,无法比较谁更强大。这个排名也无法作为“哪种数据库更优秀”的权威参考,只能从侧面说明,关系型数据库仍是应用较广泛的数据库,而NoSQL也得到了广泛的应用。

图1-2 DB-Engines网站2022年2月的全球数据库流行度排名前20

(4)NoSQL的融合与发展。

由于NoSQL放弃了关系型数据库的很多特点,这使传统关系型数据库的使用者感到不便,例如:NoSQL难以实现在线事务业务处理、不支持SQL语句等。因此有人提出结合关系型数据库和NoSQL数据库的优点,构建新型的数据库形式,并称之为“NewSQL”。

NewSQL的概念并没产生很大的号召力,也没有特别著名的产品出现,更多的新型数据库仍然被定义为NoSQL,然而NewSQL给数据库领域带来了新的发展方向,即关系型数据库和NoSQL的相互借鉴与融合。例如:一些新的NoSQL系统引入了对SQL语句的部分支持,或者提供类似SQL的数据操作和查询语法,如HBase、Neo4j等;而一些新版本的关系型数据库系统,则基于NoSQL模式开发了新的功能或模块,如MySQL的集群化数据缓存工具MySQL Cluster等,这个趋势在图1-2中也有所体现。

在NoSQL从互联网行业向传统行业推广的过程中也存在诸多阻力:一是由于技术领域和业务模式上存在差异,导致传统行业的技术人员不知道如何有效地利用工具;二是开源免费的特点使得这些工具总是处在持续地升级和改进当中,新版本层出不穷,但文档和学习资料经常是缺失或滞后的,这使得NoSQL相对难以学习;三是早期的NoSQL在可靠性和安全性上存在较多问题,这使得金融、电信和电力等对可靠性和安全性要求较高的行业不敢轻易使用NoSQL工具。

目前很多商业软件公司对原生的NoSQL进行了扩展、优化和企业级封装,并向传统行业和普通学习者进行推广。例如,整合多种大数据软件到一个平台,使之能够协同工作;构建易部署、易管理、易维护且安全、可靠的大数据软件平台,满足大企业对IT服务规范化的需求;独立研发自己的NoSQL软件或组件,使之拥有更好的性能等。上述领域的知名公司及其产品包括:华为公司的FusionInsight、Cloudera公司的Cloudera Manager、开源工具Ambari等。