前 言
作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
☕专栏简介:相当硬核,黑皮书《数据库系统概念》读书笔记,讲解:
1.数据库系统的基本概念(数据库设计过程、关系型数据库理论、数据库应用的设计与开发…)
2.大数据分析(大数据存储系统,键值存储,Nosql系统,MapReduce,Apache Spark,流数据和图数据库等…)
3.数据库系统的实现技术(数据存储结构,缓冲区管理,索引结构,查询执行算法,查询优化算法,事务的原子性、一致性、隔离型、持久性等基本概念,并发控制与故障恢复技术…)
4.并行和分布式数据库(集中式、客户-服务器、并行和分布式,基于云系统的计算机体系结构…)
5.更多数据库高级主题(LSM树及其变种、位图索引、空间索引、动态散列等索引结构的拓展,高级应用开发中的性能调整,应用程序移植和标准化,数据库与区块链等…)
文章简介:全面深入介绍数据库系统应用,数据库系统的目标,数据视图,数据库语言,数据库设计思想,数据库引擎,数据库的应用体系结构,数据库的用户与语言,数据库的发展历程九个维度,带你真正理解数据库,知道精通数据库要学习什么内容。该专栏将会把这些维度一网打尽。
数据库管理系统就是由互相关联的数据集合和一组用于访问这些数据的程序组成,简称数据库。即,数据库=数据+程序。数据库的目标就是方便、高效、安全的存储、管理数据信息。
早期的数据库简单,被作为办公室后台系统进行维护,用户通过打印报告的纸质文档作为输入数据,键盘输入就可与其交互,现在数据库越来越复杂,我们需要筛选过滤,范围查找等各种复杂操作,因此我们开发了数据库语言供程序员与其交互。
数据库使数据与用户更直接的相关联。在没有数据库之前,每一个银行客户都必须在交易时与出纳员打交道,而现在ATM机可以直接与用户交互。
有两种使用数据库的方式。
想象如果没有数据库,一个大学要怎么在计算机中存储学生、教师、课程等数据?
那只能够将数据存储在操作系统的文件中,并且编写对应的程序对于这些数据进行读写操作。至少需要有:
当需求增多,新的应用程序就需要被加入系统中,比如学校需要开设新的专业,就业为这个专业新建新的永久性文件(或者在现有文件增加新的数据),为了满足这个新专业数据处理的特殊规则,就需要编写新的程序。久而久之,越来越多的程序和文件会被添加到操作系统。
这种文件处理系统(file-processing system)在传统操作系统中是被支持的。
它有什么问题?
总结起来就是三个特点,不好存,不好取,不安全。数据库就是为了解决这些问题的。
数据的存储与维护是复杂的,对于用户当然不需要知道这些无聊枯燥的过程,数据库系统为用户提供了抽象视图,隐藏数据存储维护的某些细节。
数据库的基础是数据模型,是一个描述数据、数据关系、数据语义和一致性约束概念工具的集合。可以分为四类。
关系模型(relational model),使用表来表示数据与数据之间的联系。表也被称为关系。
实体、联系模型(entity-relationship model),实体是现实世界中的一件“事情”或者一个“物体”。实体-联系模型包括数据实体与数据之间的联系,在数据库设计阶段广泛应用,后续文章会详细介绍。
半结构化模型。结构化的数据模型可以有效的支持数据查询的响应,但是无法支持数据结构的动态修改。半结构化模型允许相同类型的数据项含有不同的属性集,比如json和xml。
半结构化模型可以有效的处理以下场景:
(1)数据缺失
例如,在公司人事档案库中,已婚雇员会有配偶项信息,而未婚的雇员则无该项信息
(2)单值和集合值属性兼容
在传统查询语言如SQL、OQL、XSQL中, 单值和集合值属性是不兼容的,即集合不能按单值处理,单值也不能按集合处理。半结构化模型可以解决该问题。
(3)查询对象类型各异
在WWW 和异构信息源集成时,会有不少内容相同而类型各异的问题。如一信息源上的电话信息是用字符串表示,而另一信息源上则可能用整数表示。有些电话信息上可能带区号,而有些则不带。又如WWW上的主页,相同实体的类型差异也很大。如主页里的朋友项,有的是用字符串给出名字,有的则带有简单描述信息或是指向其朋友的网络地址。这就要求查询处理时有宽松的类型限制或没有类型检查。
(4)异构的查询返回结果
半结构化数据的同类实体查询会出现不同的结果对象,选择语句的返回结果可能因数据源的不同而异。
(5) 查询的对象结构未知
关系型数据模型是大多数数据库的理论基础。
为了能够使数据库中的数据被高效地检索,数据库的开发人员不得不使用复杂的数据结构来表示数据。而数据库的用户多没受过专业的计算机训练,需要对他们进行如下几个层次的数据抽象,让不同层次的用户关注自己这层的事情,屏蔽不需要的内容。
数据库的整体设计被成为模式(schema),这就相当于一个模板。数据库在某一个特定时刻存储的数据总和被称为实例(instance).举个栗子,数据库的模式就像是变量的定义,而变量在每个时刻都会特定的值,这个值对应是数据库模式的一个实例。
按照不同的抽象层次划分,数据库有几种模式。物理模式在物理层描述数据库的设计,逻辑模式在逻辑层描述数据库的设计,数据库在视图层也可以有几种模式,通常被称为子模式,它用于描述数据库的不同视图。一般与程序员打交道的是逻辑模式。
数据库的定义语言DDL与数据库的操作语言DML都是数据库系统的操作语言,他们都是SQL语言的一部分,关系型数据库几乎都使用SQL语言。
数据定义语言DDL用来进行数据存储和定义。数据库中的数据必须满足一致性约束,常见的约束有:
DDL的输出会被放在数据字典中,数据字典也包含元数据,也就是关于数据的数据。数据字典可以被看做一种特殊的表,这种表只能有数据库系统本身(不是常规的用户)来访问和修改。在读取和修改实际的数据前,数据库系统先要参考数据字典。
SQL数据定义语言可以参考:
create table department
(dept_name char(20),
building char(15),
bugetn numeric(12,2));
我们还可以加完整性约束,后续文章会详细介绍。
DML可以对数据进行访问和操作( 增删改查)。有以下两种类型。
声明式的DML通常更加易学易用,由于用户不指明如何获得数据,数据库系统必须要提供一种访问数据的高效途径。
最常用的数据库查询语言SQL是非过程化的。举个栗子,一个常见的SQL查询语句如下。
select instructor.name
from instructor
where instructor.dept_name = 'History';
很显然,sql语句只可以下发给数据库进行数据的访问与操作,对于从用户输入数据,输出到显示器或者网络上等活它不管,需要高级宿主语言比如C、C++,JAVA来完成。高级宿主语言要想和将SQL指令发送给数据库,数据库就必须提供接口。对于C语言等其他几种语言,开放数据库连接(ODBC)标准定义提供了接口,JDBC标准为java语言提供了相应的接口。
数据库的设计需要考虑很多问题,但主要是数据库模式的设计,这里我们将讨论数据库模式的设计和查询语句的编写。
(1)需求确定。数据库设计的初始阶段是和领域专家、数据库用户充分讨论,形成数据库用户需求说明书文档,说明数据库用户的数据需求,以及将怎样构造数据库用户满足这些需求。
(2)概念设计。下一步,设计者要选择一个数据模型,将需求转换成一个数据库的概念模式,形成企业的详细综述,再复审这个模式,确保满足所有的数据需求并且需求之间没有冲突。
从关系模型角度,这个阶段还需要涉及数据库应该包含哪些属性,以及如何组织这些属性到各个表中。前者主要是决策,后者主要是计算机科学问题,解决方法主要有两种,一种是使用实体-联系模型,另一种是使用一套算法,后续我们将详细介绍。
一个开发完整的概念模式还将指出企业的功能需求。也就是用户需要做哪些增删改查,进行复审,确保其满足需求。
(3)逻辑设计。将高层的概念映射到要实现的数据库系统的系统模型上。
(4)物理设计。说明数据库的物理特性,包括文件的组织形式和内部存储特征。
数据库系统大致可以分为以下功能模块:存储管理器、查询处理器和事务管理部件。
数据库的存储管理十分重要,因为企业数据库的大小通常达到数百个gigabyte(千兆字节),甚至达到terabyte(万亿字节)。最大的企业数据库规模达到数个petabyte(千万亿字节)。计算机主存存储不了这么多信息,而且系统奔溃时主存会丢失,因此,信息被存储在磁盘中。从磁盘读取数据速度是很慢的,因此,固态硬盘也被越来越多的应用到了数据库的存储中。
查询处理器也很重要,他简化和促进了用户对数据的访问,使得用户能够获得很高的性能,同时有不必要了解系统实现的物理层细节和负担。
事务处理器同样也很重要,它使应用开发人员能够把一系列的数据库操作当作一个单元来看待,保证数据的安全性。、
传统的数据库引擎是集中式的计算机系统,而现代数据库引擎则非常注重并发数据存储和并发查询处理。
存储管理器是存储数据,并对应用程序以及向系统提交的查询之间的提供查询接口的部件。它主要负责数据库中数据的存储、检索和更新。
存储管理器部件主要包括。
查询处理器包括。
事务的原子性和持久性都是数据库系统的自身职责,确切的说,是恢复管理器的职责。如果事务总能被成功的执行,那么自然可以保证原子性。但是如果一系列的事务不总成功被执行完毕,为了保证原子性,失败的事务不应该对数据库产生任何影响,在这种情况下,数据库系统需要进行故障恢复,也就是它必须检测系统故障并且将数据库恢复到故障发生以前的状态。
另外,当几个事务并发对数据库进行更新时,即使每个单独的事务是正确的,对数据库的一致性也可能被破坏。并发控制管理器控制并发事务间的相互影响。保证数据库的一致性。事务管理器包括并发控制管理器和恢复管理器。
现在我们终于可以来给出数据库的体系结构图了。
上面的数据库体系结构是集中式的。虽然有多个cpu进行并行存储,但是所有cpu都i访问一个公共的共享内存。为了扩展到更大的数据库规模和更高的处理速度,研究人员又设计了包括多台机器的集群上的并行数据库(paraller database)。
数据库系统把用户分成了四种,不同用户访问不同类型的数据库界面。
数据库管理员(Database Adminitrator,DBA)对数据和访问数据的程序进行集中控制。他们的作用包括:
数据库最早起源于20世纪初,Herman Hollerith发明穿孔卡片,记录美国人口普查数据,采用机械系统来存储卡片的显示结果。
20世纪50年代到60年代初,磁带被开发来数据存储。它只能顺序读取,数据规模可以比内存大很多。
20世纪60年代末和70年代初,硬盘广泛用于存储数据。磁盘任何位置都可以在几十毫秒内访问到,数据摆脱了顺序访问的限制。
Edgar Codd在1970年撰写了关系模型论文,至此关系型数据库诞生,关系型数据库其简单性和对程序员屏蔽所有实现细节对程序员充满了诱惑力。
20世纪70年代末和80年代。第一个关系型数据库SQL/DS诞生,同一时期,Oracle的第一个版本诞生了。到80年代默契,关系型数据库打败了层级和网状数据库,独占鳌头。
80年代,人们还对分布式和并行数据库有了很多研究。
20世纪90年代。数据库最开始设计时时为了支持决策,80年代数据库的支柱却是查询密集、更新密集的事务处理。90年代,数据库决策概念再次大火,数据分析工具有了更加广泛的应用,与此同时,互联网在这一时期爆炸式发展,数据库逐渐要求高性能,高可用,高可靠。
21世纪第一个十年。XML发展成数据交换的标准,紧随其后,适用于javascript与其他语言交换数据的格式JSON开始重要起来。数据库系统增加了对这两种格式数据的支持。空间数据在导航等系统广泛应用,数据库系统也增加了对这些数据的支持。
开源数据PostSQL和MySQL的使用不断增长,“Auto-admin”特性被加到数据库中,使其能够自动重新配置,以适应不断变化的工作负载。减少了数据库管理的工作。
社交网络平台的发展,也促进数据库从表格化到图形数据库的发展。
在第一个十年的后期,数据挖掘应用变得特别普遍,适合数据挖掘市场的数据库系统被开发出来,如“列存储”,将表按列进行存储,而不是按照主流数据库进行行存储。
各种各样的新的数据密集型应用以及对快速开发的需求,特别是新兴的公司的需求,导致了"NoSQL"的诞生。NoSQL的数据脱离关系型的严格一致性支持,是的分布式数据库具有更大的灵活性,它的特点是“最终一致性”。
21世纪的第二个10年,NoSQL尽管带来了高可用性和可伸缩性,但是渐渐被发现其不一致性使得程序员和数据库管理员的工作越来越复杂,应用系统逐渐演化为提供特性以支持一致性的更加严格的概念,并且继续支持高可用和可伸缩性。
各个企业越来越多的外包他们的数据存储和管理,企业开始把数据存储在“云”服务中。这使企业节约了成本,但是也产生了新的问题,主要输数据安全、责任以及所有权的问题。网络安全面临新的挑战。