001.概述
1. 说明
本章内容对数据库的性质和目标进行了一般性的综述,解释了数据库系统的概念是如何发展的,各数据库系统的共同特性是什么,数据库系统能为用户做什么,以及数据库系统如何与操作系统交互。
数据库管理系统(DataBase-Management System, DBMS)是由一个互相关联的数据的集合和一组用以访问这些数据的程序组成的。这个数据集合通常称作数据库,其中包含了一定的信息。DBMS的主要目标:提供一种方便、高效地存取管理大量数据库信息的途径。对数据库的管理涉及信息存储结构的定义及信息操作机制的提供,而且数据库系统还需保证所存取信息的安全性。
2. DBMS的应用
企业信息,如:存储客户、产品、收据、工资和销售等信息
银行和金融业,如:存储客户信息、账户、贷款和交易记录等信息
大学,如:存储学生信息、课程注册和成绩等信息
电信业,如:存储通话记录、流量统计、消费账单和通信网络等信息
3. DBMS的目标
在DBMS出现以前,通常采用文件处理系统来存储信息,但是其存储组织信息主要由以下弊端:
- 数据的冗余和不一致。主要表现为:文件的重复性和更新后文件信息的不一致
- 数据访问困难。主要表现为:不支持方便而高效地获取所需的数据
- 数据孤立。主要表现为:数据分散在不同格式的文件中,难以检索数据
- 完整性问题。主要表现为:某些数据的值必须满足特定的一致性约束(比如账户余额不得低于零),难以满足新的约束添加
- 原子性问题。主要表现为:对数据的某些操作必须是原子的——要么全部发生要么全不发生,比如账户转账
- 并发访问异常。主要表现为:大量用户同时访问更新数据的管理问题
- 安全性问题。主要表现为:不同用户的权限问题
4. 数据视图
数据库系统是一些互相关联的数据以及一组使得用户可以访问和修改这些数据的程序的集合。数据库系统的主要目的之一是为用户提供数据的抽象视图,也即系统隐藏数据存储和维护的某些细节。
4.1 数据抽象
一个可用的DBMS必须能高效地检索数据。这种高效性的需求要求数据库使用复杂的数据结构来表示数据。然而,DBMS的用户不需要了解数据库底层的数据结构,DBMS提供了多个层次上的抽象来对用户屏蔽复杂性,以此简化用户与系统的交互:
- 物理层。最底层的抽象,描述数据是怎样存储的,详细描述了复杂的底层数据结构。
- 逻辑层。高于物理层的抽象,描述数据库中存储的数据以及数据间的关系。
- 视图层。最高层次的抽象,描述整个数据库的某个部分。
三层抽象间的关系如下图所示:
可以将此与程序设计语言中数据类型的概念进行类别,以便理解各层抽象间的区别。以C语言为例:
struct instructor {
char id[5];
char name[20];
char deptName[20];
double salary;
}
上述代码定义了一个具有四个字段的结构体instructor
。该结构体的每个字段都有一个字段名和类型。对一个大学而言,可能存在以下结构结构体类型:
- department,包含字段deptName、building和budget
- course,包含字段courseID、title、deptName和credits
- student,包含字段ID、name、deptName和totCred
在物理层,一个instructor
、department
或course
结构体被描述为连续存储位置的存储块。编译器为程序员隐藏了这一层的细节。与之类似,数据库系统为数据库程序员隐藏了做底层的存储细节。
在逻辑层,每个类似的结构体通过其定义进行描述。同时,还要定义这些类型间的相互关系,程序员一般在这个层次上进行工作。与之类似,数据库管理员在这个层次工作。
在视图层,计算机用户看见的是隐藏了数据类型细节的一组应用程序。与之类似,视图层上定义了数据库的多个试图,数据库用户看到的是这些试图。除隐藏数据库的底层细节外,试图提供了防止用户访问书库的某些部分的安全性机制。
4.2 实例和模式
随着信息的插入、修改或删除,数据库也就发生了变化。特定时刻存储在数据库中的信息的集合称作数据库的一个实例(instance)。数据库的总体设计称作数据库的模式(schema)。
数据库模式和示例的概念类似于程序设计语言中的程序类比。模式对应于变量声明以及与之关联的类型的定义,实例对应于每个变量在的特定时刻的值。
根据抽象层次,数据库系统可分为以下模式:
- 物理模式,在物理层描述数据库的设计
- 逻辑模式,在逻辑层描述数据库的设计
- 子模式,描述数据库的不同视图
程序员一般使用逻辑模式构造数据库应用程序。若应用程序不依赖于物理模式,则它们就称为是具有物理数据独立性。
4.3 数据模型
数据库结构的基础是数据模型——一个描述数据、数据联系、数据语义以及一致性约束的概念工具的集合。数据模型提供了描述物理层、逻辑层以及视图层数据可设计的方式。
数据模型可划分为四类:
- 关系模型。关系模型用表的集合来表示数据和数据间的联系。每个表由多个列,每列都有唯一的列名。关系模型是基于记录的模型的一种。基于记录的模型的名称的由来是因为数据库是由若干种固定格式的记录来构成的。每个表都包含某种特定各类型的属性。关系模型是当今市容最广泛的数据模型。
- 实体-联系模型。实体-联系数据模型(E-R)基于对显示世界的认知:现实世界由一组称作实体的基本对象和这些对象间的联系构成。实体是现实世界中区别于其他对象的一件事情或一个物体。
- 面向对象的数据模型。该模型可视为对E-R模型增加了封装、方法和对象标识等概念后的扩展。该模型结合了面向对象的数据模型和关系数据模型的特征。
- 半结构化数据模型。该模型允许相同类型的数据项含有不同的属性集的数据定义。实例:可扩展标记语言xml被广泛地用来表示半结构化数据。
此外,历史上网状数据模型和层次数据模型相遇关系数据模型出现。这些模型和底层的实现联系很紧密,且使得数据建模复杂化。因而,很少被使用。
5. 数据库语言
数据库系统提供数据定义语言来定义数据库模式,提供数据操纵语言来表达数据库的查询和更新。这两者简单地构成了单一的数据库语言(如SQL)的不同部分。
数据操纵语言(Data-Manipulation Language, DML)允许用户访问或操纵按照某种数据模型组织起来的数据。有以下访问类型:
- 检索信息
- 插入信息
- 删除信息
- 修改信息
通常由两类基本的数据操纵语言:
- 过程式DML要求用户指定需要什么数据以及如何获取这些数据
- 声明式DML仅要求用户指定需要什么数据
数据库模式是通过一系列定义来说明的,这些定义由数据定义语言(Data-Definition Language, DDL)来表达。DDL也可用于定义数据的其他特征。
数据库系统使用存储结构和访问方式是通过一系列特殊的DDL语句说明的。这种特殊的DDL称作数据存储和定义语言,其定义了数据库模式的实现细节。
之前提到,存储的数据值必须满足某些一致性约束。DDL提供了指定该约束的工具,每当数据库信息变动时,数据库系统将检查这些约束。
- 域约束。每个属性都必须对应一个所有取值构成的域(如整数型,字符型,时间型)。
- 参照完整性。一个关系中给定属性集上的取值也在另一关系的某一属性集的取值中出现。若数据的修改会导致参照完整性约束被违反,通常会拒绝执行操作。
- 断言。一个断言就是数据库需要时刻满足的某一条件,域约束和参照完整性约束是断言的特殊形式。有效的断言创建后,只有不破坏断言的数据库更新才被允许。
- 授权。对不同的用户在数据库中的不同数据值上允许不同的访问类型。如:读权限、插入权限、更新权限、删除权限。
DDL以一些指令作为输入,产生一些输出。DDL的输出放在数据字典中,数据字典包含了元数据——关于数据的数据。可将数据字典看作是一种特殊的表,这种表只能由数据库系统本身来访问和修改。在读取和修改实际的数据前,数据库系统要想参考数据字典。
6. 关系数据库
关系数据库基于关系模型,使用一系列数据表来表达数据及其之间的联系。关系数据库中也包含DML和DDL。
表
数据库中以表为组织单位存储数据。表类似于C中的结构体数组,表中具有若干列,类似于结构体中的字段。表中的行类似于结构体数组的一个成员。每个表有多个列,每个列有唯一的名字。如下所示的关系数据库示例,由两个表组成:instructor表展示了大学教师的信息,department表展示了每个系的信息。
关系模型是基于记录的模型的一个实例。使用基于记录的模型的名字是因为数据库的结构是几种固定格式的记录。每个表包含一种特定类型的记录,每种记录类型定义固定数目的字段或属性。表的列对应记录类型的属性。
数据库操纵语言
SQL查询语言是非过程化的,它以几个表作为输入,总是返回一个表。下面的SQL查询例子,查询历史系所有的教员名字:
select instructor.name
from instructor
where instructor.deptName = 'History';
上述查询从instructor表中获取deptName为History的所有行,且显示这些行的name属性。
数据定义语言
SQL提供了丰富的DDL,通过DDL可以定义表、完整性约束、断言等。
以下的SQL DDL语句定义了department表:
create table department (
deptName char(20),
building char(15),
budget numeric(12, 2);
)
应用程序访问数据库
SQL不支持注入输入、输出、网络通信等操作,这些操作必须使用宿主语言来写,如:C、C++、Java等,在其中使用嵌入式的SQL查询来访问数据库中的数据。此处的应用程序是指以这种方式与数据库进行交互的程序。
为了访问数据库,DML语句需要由宿主语言来执行。有两种途径可以做到这一点:
- 通过提供应用程序接口,它可以用来将DML和DDL的语句发送给数据库,再取回结果。如:C语言的开放数据库连接(ODBC)标准,Java数据库连接(JDBC)标准等
- 通过扩展宿主语言的语法,再宿主语言的程序中嵌入DML调用。通常用一个特殊字符作为DML调用的喀什,通过DML预编译器,将DML语句转变为宿主语言中的过程调用。
7. 数据库设计
7.1 设计数据库
数据库设计的主要内容是数据库模式的设计。
高层的数据模型为数据库设计者提供了一个概念框架,以此说明数据库用户的数据需求,以及将怎样构造数据库结构以满足这些需求。初始阶段,刻画预期的数据库用户的数据需求,制定出用户需求的规格文档。
概念设计阶段,选择数据模型,并用该模型的概念将需求转换成数据库的概念模式。这个模式要确保所有的数据需求都满足且相互之间没有冲突。这一阶段重点是描述数据以及它们之间的联系,而非指定物理的存储细节。
从关系模型的角度来看,概念设计阶段涉及决定数据库中应该包含哪些属性,以及如何将这些属性组织到多个表中。对于后者,主要有两个方式:一种是使用实体-联系模型,一种是引入规范化算法,将所有的属性集作为输入,生成一组关系表。
开发完全的概念模式还要指出企业的功能需求。在功能需求说明中,用户描述数据之上的各种操作或事务,如更新数据、查询数据、删除数据等。
接着是逻辑设计阶段,设计者将高层的概念模式映射到使用的数据库系统的实现数据模型上。
最后是物理设计阶段,设计者将指定数据库的物理特性,包括文件组织的形式以及内部的存储结构等。
实例:大学结构的数据库设计
大虚的主要特性:
- 大学分成多个系。每个系有自己唯一的名字deptName来标识,坐落在特定的建筑物building中,有自己的经费预算budget。
7.2 实体-联系模型
实体-联系(E-R)数据模型使用一组称作实体的基本对象,以及这些对象间的联系。实体是现实世界中可区别于其他对象的一件事情或物体。
数据库中实体通过属性集合来描述。联系是几个实体之间的关联。同一类型的所有实体的集合称作实体集,同一类型的所有联系的集合称作联系集。数据库的总体逻辑模式可用E-R图来进行图形化表示,最常用的方法之一是采用统一建模语言UML。使用UML的符号,E-R图如下表示:
- 实体集用矩形框表示,实体名在头部,属性名列在下面。
- 联系集用连接一堆相关的实体集的菱形表示,联系名放在菱形内部
示例:
除了实体和联系外,E-R模型还描绘了数据库必须遵守的对其内容的某些约束。一个重要的约束是映射基数,它表示通过某个联系集能与一实体进行关联的实体数目。例如,一位教师只能属于一个系,E-R模型就能表达出这种约束。
7.3 规范化
规范化的目标是生成一个关系模式集合,使我们存储信息时没有不必要的冗余,同时又能轻易地检索数据。这种方法时设计一种适当的范式的模式,常用的方法是函数依赖(之后学习)。
8. 数据存储和查询
数据库系统划分为不同的模块,每个模块完成整个系统的一个功能。数据库系统的功能部件大致可分为存储管理器和查询处理部件。由于数据库常常需要大量存储空间,因此信息被存储在磁盘上,需要时数据在主存和磁盘间移动。数据出入磁盘的速度比CPU的速度慢很多,因此数据库系统对数据的组织必须满足是磁盘和主存之间的数据移动最小化。查询处理帮助数据库系统简化和方便了数据的访问。查询处理器使得数据库用户在视图层上工作且获取高性能,不需了解系统实现的物理层细节。
存储管理器
存储管理器时数据库系统中负责在数据库中存储的底层数据与应用程序以及向系统提交的查询之间提供接口的部件。存储管理器负责和文件管理器交互,原始数据通过操作系统提供的文件系统存储在磁盘上。磁盘管理器将各种DML语句翻译为底层文件系统命令。因此,存储管理器负责数据库中的存储、检索和更新。
存储管理部件包括:
- 权限及完整性管理器,负责检测是否满足完整性约束以及检查访问数据的用户的权限。
- 事务管理器,负责保证数据库的一致状态和并发事务的执行不发生冲突。
- 文件管理器,负责管理磁盘空间的分配,管理用户表示磁盘上所存储信息的数据结构。
- 缓冲区管理器,负责将数据从磁盘取到内中,并确定数据的缓冲存储。
存储管理器实现了几种数据结构,作为系统物理实现的一部分:
- 数据文件,存储数据库自身
- 数据字典,存储数据库结构的元数据,尤其是数据库模式
- 索引,提供对数据项的快速访问。
查询处理器
查询处理器包括:
- DDL解释器,负责解释DDL语句并将定义记录在数据字典中。
- DML编译器,将查询语言中的DML语句翻译为一个执行方案,包括一系列查询执行引擎的低级指令。
- 查询执行引擎,负责执行由DML编译器产生的低级指令
注:DML还会进行查询优化,将选取多种等价的具有相同结果的执行方案的代价最小的一种。
9. 事务管理
一般,数据的若干个操作形成了一个逻辑操作,如银行账户间的转账。这种操作应当保证原子性——操作要么完成要么不完成,保证一致性——两个账户的余额之和不表,保证持久性——转账结束后,即使系统故障,两个账户的余额应为新值。
事务(transaction)是数据库应用中完成单一逻辑功能的操作集合。每一个事务是一个既有原子性又有一致性的单元。因此,事务不能违反任何的数据库一致性约束,即事务执行前后数据库一致。但是事务执行过程中,允许暂时的不一致。
事务管理器包括并发控制器和恢复管理器。
原子性和持久性的保证是由恢复管理器负责的。失败的事务影响了系统状态,则恢复管理器负责故障恢复,即检测系统故障并将数据库恢复到故障发生前的状态。
此外,并发控制管理器负责控制并发事物间的相互影响,保证数据库一致性。
10.数据库体系结构
数据库系统的体系结构很大程度上取决于数据库系统所运行的计算机系统。数据库系统可以是集中式的、客户/服务器式的,也可以是分布式、并行式的。
通过网络相连的远程数据库:客户机、服务器。
数据库应用可以分为两或三个部分。在一个两层体系结构中,应用程序驻留在客户机上,通过查询语言表达式来调用服务器上的数据库系统功能,使用ODBC和JDBC这样的应用程序接口标准进行客户端和服务器的交互。在一个三层体系结构中,客户机仅作为一个前端。客户端通过一个表单界面与应用服务器进行通信,应用服务器与数据库系统通信以访问数据。应用程序的业务逻辑嵌入到应用服务器中,而非分布在多个客户机上。
11. 数据挖掘与信息检索
数据挖掘date mining指半自动地分析大型数据库并从中找出有用的模式的过程。同机器学习和统计分析一样,数据挖掘视图从数据中寻找规则和模式。不同之处在于,数据挖掘处理大量的主要存储在磁盘上的数据,也即在数据库中发现知识。从数据库中发现的某些类型知识可以用一套规则来表示。
信息检索information retrieval指查询非结构化的文本数据。信息检索重点在于关键词的查询,文档与查询的相似度,以及文档的分析、分类和索引。