数据库发展史(中)

《数据库发展史(上)》中,为大家介绍了网状数据库和层次数据库、关系数据库、分布式数据库、云数据库的发展史。本篇文章为大家介绍NoSQL数据库和NewSQL数据库的发展历程。

NoSQL数据库

尽管关系数据库系统技术已经相对成熟,能很好地处理表格类型的数据,但对业界出现的越来越多复杂类型的数据(如文本、图像、视频等)无能为力。尤其是步入互联网Web 2.0和移动互联网时代,许多互联网应用有着高并发读写、海量数据处理、数据结构不统一等特点,传统的关系数据库并不能很好地支持这些场景。另一方面,非关系数据库有着高并发读写、数据高可用性、海量数据存储和实时分析等特点,能较好地支持这些应用的需求。因此,一些非关系数据库也开始兴起。

为了解决大规模数据集合和多种数据种类带来的挑战,NoSQL数据库应运而生。NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的数据库。NoSQL最常见的解释是“非关系型(Non-Relational)”,但是“不仅仅是SQL(Not Only SQL)”的解释也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库。它们不保证关系数据的四个特性:原子性、一致性、隔离性、持久性(Atomicity、Consistency、Isolation、Durability,可简称ACID)。

NoSQL是全新的数据库革命性运动的体现,其拥护者提倡运用非关系型的数据存储,相对于铺天盖地的关系数据库运用,这一概念无疑是一种全新的思维注入。因为NoSQL数据库去掉了关系数据模型的特性,因此数据之间没有关系,容易进行扩展。例如,脸书(Facebook)或者推特(Twitter)每天都为用户收集万亿比特的数据,这些数据的存取不需要固定的模式,使用NoSQL无须多余的操作就能实现横向扩展,无形之中也在数据库架构的层面上带来了可扩展的能力。此外,得益于NoSQL数据库数据模型的无关系性,数据库的结构变得比较简单,因此容易支持海量数据的存储和高并发读写,性能比较优秀。

Johan Oskarsson在2009 年发起了一场关于分布式开源数据库的讨论,EricEvans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式和不提供ACID特性的数据库设计模式。2009年在亚特兰大举行的“no:sql(east)”讨论会是一个里程碑,其口号是“select fun,profit from real_world where relational=false;”。因此,对NoSQL最普遍的解释是“非关系型的”,强调键值存储和文档数据库的优点,而不是单纯的反对关系数据库。

虽然NoSQL数据库具有灵活的数据模型、高扩展性和高可用性等特点,但是,NoSQL不支持SQL查询,不支持数据的强一致事务处理,只能保证数据的弱一致性。NoSQL数据库主要包括4种类型: 文档数据库(Document-Oriented Database)、列簇式数据库(Column-family Database)、键值数据库(Key-Value Database)和图数据库(Graph Database)。接下来将分别介绍这四种数据库。

1. 文档数据库

从1989年起,美国Lotus公司(已被IBM 兼并)通过其群组工作软件产品Notes提出了数据库技术的全新概念———文档数据库(Document-Oriented Database),与传统数据库相比,文档数据库是用来管理文档的。在传统数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。通俗地说,文档数据库假设存储的数据均按某种标准或编码来封装数据,这些封装好的数据可以是XML、YAML、JSON 或者BSON 等,也可以是PDF和微软Office文档等二进制文档格式。例如,XML数据库是针对XML文档做了优化的面向文档的数据库的子类。一些搜索引擎(也称为信息检索)系统如Elasticsearch提供了足够的对文档的核心操作,从而满足面向文档数据库的定义。

常见的文档数据库有MongoDB、Apache CouchDB、亚马逊AWS的Document DB等。以MongoDB数据库为例,它是一个由C++ 语言编写的基于分布式文件存储的文档数据库。MongoDB的每个数据库(Database)下包含多个集合(Collection),每个集合下又可以有多个文档(Document),每个文档中的每条记录(Record)就是一条数据。这与关系数据库的记录(Record)和数据表(Table)的概念相似,但是同一个集合下的文档可以存储格式不同的数据,存储操作更加灵活。其他的文档数据库产品与之类似,在此不一一赘述。

2. 列簇式数据库

传统数据库有列数的限制,而宽表(BigTable、Hbase)通过列簇的概念来降低这一限制。但是宽表带来了存储的开销,而列簇数据库通过融合行键值和列来形成统一关键字,并且可以把值分成多个列簇,让每个列簇代表一张数据映射表。典型的列簇式数据库包括Hbase、BigTable、Cloudera和Cassandra等。以Hbase为例,它是一个开源的非关系型分布式数据库(NoSQL),参考了谷歌的BigTable建模,实现的编程语言为Java。Hbase是Apache软件基金会的Hadoop项目的一部分,运行于HDFS文件系统之上,为Hadoop提供类似于BigTable规模的服务。

但列簇数据库不同于列数据库。数据库存储方式分为两种: 行存储和列存储。行存储即按照行进行组织存储,适合于交易型业务,例如整行数据的增加和删除; 而列存储是按照列进行存储,适合于分析型业务,例如单列数据的聚集分析。下图是两种存储方法的图形对比。

数据库发展史(中)

列存储和行存储对比图
## 3. 键值数据库

键值数据库使用简单的键值方法来存储数据,是一种最简单的NoSQL数据库,具有较高的容错性和可扩展性。该类数据库将数据存储为键值对集合,其中键作为唯一标识符,键和值都可以是从简单对象到复杂对象的任何内容。在不涉及过多数据关系业务的需求中,使用键值存储可以非常有效地减少读写磁盘的次数,比关系型存储拥有更好的读写性能,能够解决关系数据库无法存储的数据结构问题。但是该类数据库的事务不能完全地支持ACID特性。

常见的键值数据库包括面向内存的键值数据库Redis和Memcached,面向磁盘的键值数据库RocksDB和LevelDB等。

•Redis是一个使用ANSI C语言编写的开源、基于内存、支持网络、可选持久性的键值对存储数据库。Redis是目前最流行的键值对存储数据库之一,经常被用于存取缓存数据。

•Memcached是一个开放源代码、高性能、分布式的内存对象缓存系统,用于加速动态Web应用程序,减轻关系数据库的负载。它可以应对任意多个连接,使用非阻塞的网络IO。它的工作机制是在内存中开辟一块空间,然后建立一个Hash表,Memcached自管理这些Hash表。Memcached设计简单而强大,简单的设计促进其迅速部署,易于发现所面临的问题,解决了很多大型数据缓存的问题。

•LevelDB是一个由谷歌研发的键值对嵌入式数据库管理系统编程库,以开源的BSD许可证发布。

4. 图数据库

图数据库的历史可以追溯到20世纪60年代的Navigational Databases,这时IBM也开发了类似树结构的数据存储模型。经过30多年的漫长发展,期间出现过可标记的图形数据库Logic Data Model。直至21世纪初,具有ACID特性的里程碑式图数据库产品,如Neo4j、Oracle Spatial and Graph,才被开发出来并进行商业化。到2010年后,可支持水平扩展的分布式图数据库开始兴起,例如OrientDB、ArangoDB、MarkLogic。

至今,各式各样的图数据库越来越受到重视,在谷歌、领英、脸书等一些大公司中,已经有了广泛应用。图数据库的成功可以归结为很多因素,但归根结底是因为它们通过大量复杂的信息来支撑各类新型应用,例如知识图谱、社交网络分析。

NewSQL数据库

NoSQL数据库系统不具备高度结构化查询等特性,也不能提供ACID 的操作。此外,由于不同的NoSQL数据库都有各自的查询语言,这使它很难规范应用程序接口。为了解决NoSQL存在的这些问题,NewSQL数据库逐渐被提出来,这个概念是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统关系数据库的ACID和SQL等特性。

2011年,451研究所的Matthew Aslett在其论文中首次提出了NewSQL概念。从2011年后,一些商业公司和研究项目人员开始使用NewSQL来描述他们的系统。2012年谷歌在OSDI(USENIX Symposium on Operating Systems Design and Implementation)上发表了Spanner系统的论文,2013年在SIGMOD(Special Interest Group on Management ofData)发表了F1系统的论文,这两篇论文让业界第一次看到了关系模型和NoSQL的扩展性在超庞大集群规模上融合的可能性。Spanner/F1 论文引起了广泛关注,Cockroach Labs开发了CockroachDB分布式数据库,部署简单,具有很好的易用性;PingCAP开发了TiDB,结合了关系数据库和NoSQL数据库的特性,具备强一致性和高可用性。

NewSQL数据库正在持续发展,在NewSQL概念下提出的多种数据库设计为开发人员提供了针对不同用例的多种选项,极大地推动了创新和专业数据库设计的发展。但是,没有任何NewSQL系统像传统的SQL系统那样具有通用性,目前大多数NewSQL数据库都是专有软件或仅适用于特定场景,这极大地限制了新技术的普及和采用,而且NewSQL对传统SQL系统的丰富工具仅仅提供部分访问,因此亟待开发具有通用能力的NewSQL系统。

数据库发展史(中)

Gauss松鼠会是汇集数据库爱好者和关注者的大本营,

大家共同学习、探索、分享数据库前沿知识和技术,

互助解决问题,共建数据库技术交流圈。

上一篇:Redis:1、概述


下一篇:查漏补缺!2021Java精选面试实战总结整理,已拿offer