数据库
# 1. 基本概念
# 1.1. 数据库与数据库管理系统
- 数据库系统(DBS):从广义上讲是由数据库、硬件、软件和人员组成的,其中管理的对象是数据
- 数据库(DB):是指长期存储在计算机内的、有组织的、可共享的数据集合
- 硬件:是指构成计算机系统的各种物理设备,包括存储数据所需的外部设备
- 软件:包括操作系统、数据库管理系统及应用程序
- 人员:系统分析师和数据库设计人员、应用程序员、最终用户、数据库管理员(DBA)
# 1.2. DBMS 的功能
- 主要功能:数据定义,数据操作,数据库运行管理,数据组织、存储和管理,数据库的建立和维护
- 其他功能:如 DBMS 在网络中与其他软件系统的通信功能,一个 DBMS 与另一个 DBMS 或文件系统的数据转换功能等
# 1.3. DBMS 的特征与分类
- DBMS 的特征:数据结构化且统一管理、有较高的独立性、数据控制功能
- DBMS 的分类:关系数据库系统(RDBS)、面向对象的数据库系统(OODBS)、对象关系数据库系统(ORDBMS)
# 1.4. 数据库的三级模式结构
# 1.4.1. 模式结构
数据库系统采用三级模式结构,这是数据库管理系统内部的系统结构
- 概念模式。也称模式,是数据库中全体数据的逻辑结构和特征的描述,它由若干个概念记录类型组成,只涉及行的描述,不涉及具体的值
- 外模式。也称用户模式或子模式,是用户与数据库系统的接口,是用户用到的那部分数据的描述,由若干个外模式记录类型组成
- 内模式。也称存储模式,是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式,定义所有的内部记录类型、索引和文件的组织方式以及数据控制方面的细节
# 1.4.2. 两级映像
数据库系统在三级模式之间提供了两级映像,即模式 / 内模式映像和外模式 / 模式映像
- 模式 / 内模式映像。该映像存在于概念级和内部级之间,实现了概念模式到内模式之间的相互转换。(物理独立性)
- 外模式 / 模式映像。该映像存在于外部级和概念级之间,实现了外模式到概念模式之间的相互转换。(逻辑独立性)
# 2. 数据模型
# 2.1. 数据模型的基本概念
- 概念数据模型。也称信息模型,是按用户的观点对数据和信息建模,是现实世界到信息世界的第一层抽象,强调其语义表达能力,易于用户理解,是用户和数据库设计人员交流的语言,主要用于数据库设计。这类模型中最著名的是实体联系模型,简称 E-R 模型
- 基本数据模型。它是按计算机系统的观点对数据建模,是现实世界数据特征的抽象,用于 DBMS 的实现。基本的数据模型有层次模型、网状模型、关系模型和面向对象模型 (OOM)
# 2.2. 数据模型的三要素
数据模型是用来描述数据的一组概念和定义。数据模型的三要素是数据结构、数据操作、数据的约束条件。
- 数据结构:是所研究的对象类型的集合,是对系统静态特性的描述。
- 数据操作:是对数据库中各种对象 (型) 的实例 (值) 允许执行的操作集合,包括操作及操作规则。数据操作是对系统动态特性的描述。
- 数据的约束条件:是一组完整性规则的集合。也就是说,对于具体的数据应用必须遵循的语义约束条件,以保证数据的正确、有效、相容。
# 2.3. E-R 模型
实体 - 联系模型简称 E-R 模型,所采用的 3 个主要概念是实体、联系和属性。E-R 模型是软件工程设计中的一个重要方法,因为它接近于人的思维方式,容易理解并且与计算机无关,所以用户容易接受。一般遇到实际问题,应先设计一个 E-R 模型,然后再把它转换成计算机能接受的数据模型。
实体:是现实世界中可以区别于其他对象的 “事件” 或 “物体”。每个实体由一组特性 (属性) 来表示,其中的某一部分属性可以唯一表示实体。实体集是具有相同属性的实体集合
联系:实体集之间的对应关系称为联系。实体间的联系分为实体内部的联系和实体与实体之间的联系。实体集内部的联系反映数据在同一记录内部各字段间的联系。而实体集之间的联系类型有:
- 一对一联系:如果对于实体集 A 中的每一个实体,实体集 B 中至多有一个实体与之联系;反之亦然,则称实体集 A 与实体集 B 具有一对一联系。记为 1:1
- 一对多联系:如果对于实体集 A 中的每一个实体,实体集 B 中有 n 个实体 (n≥0) 与之联系;反之,对于实体集 B 中的每一个实体,实体集 A 中至多只有一个实体与之联系,则称实体集 A 与实体集 B 有一对多联系。记为 1:n
- 多对多联系:如果对于实体集 A 中的每一个实体,实体集 B 中有 n 个实体 (n≥0) 与之联系;反之,对于实体集 B 中的每一个实体,实体集 A 中也有 m 个实体 (m≥0) 与之联系,则称实体集 A 与实体集 B 具有多对多联系。记为 m:n
属性:是实体某方面的特性。在同一实体集中,每个实体的属性及其域是相同的,但可能取不同的值。E-R 模型中的属性有以下分类:
- 简单属性和复合属性
- 简单属性是原子的、不可再分的
- 复合属性可以细分为更小的部分 (即划分为别的属性)
- 单值属性和多值属性
- 若定义的属性对于一个特定实体只有一个值,这样的属性叫做单值属性
- 若定义的属性对应一组值,则称为多值属性
- NULL 属性:当实体在某个属性上没有值或属性值未知时,使用 NULL 值,表示无意义或不知道
- 派生属性:可以从其他属性得来
E-R 方法:概念模型中最常用的方法是实体 - 模型方法,简称 E-R 方法。该方法直接从现实世界中抽象出实体 和实体间的联系,然后用非常直观的 E-R 图来表示数据模型。在 E-R 图中主要构件如下:

扩充的 E-R 模型:扩充的 E-R 模型包括弱实体、特殊化、概括、聚集等概念。
# 3. 关系代数
# 3.1. 关系数据库的基本概念
属性和域:在现实世界中,要描述一个事物,常常取其若干特征值来表示。这些特征称为属性。每个属性的取值范围的集合,称为该属性的域。一般在关系数据库模型中,对域还加了一个限制,所有的域都应是原子数据的集合。关系数据库模型的这种限制称为第一范式 (1NF) 条件。如果关系数据库模型突破了 1NF 的限制,则不能称为 1NF 的。
笛卡尔积和关系
设 为任意集合,定义 的笛卡尔积为
其中,每一个元素 叫做一个 元组,元组的每一个值 叫做元组的一个分量,若 为有限集,其基数为,则 的基数 为
笛卡尔积可以用二维表来表示。
的子集叫做在域 上的关系,记为 称关系 为 元关系。
一个关系可以用二维表来表示。关系中属性个数为元数,元组的个数为基数
关系的相关名词:
目或度:常用 表示关系的字,
n表示关系的目或度候选码:若关系中的某一属性或属性组的值能唯一标识一个元组,则称该属性或属性组为候选码。
主码:若一个关系有多个候选码,则选定其中一个为主码。
主属性:所有候选码都是主属性,其他都是非主属性。
外码:如果关系模式 R 中的属性或属性组非该关系的码,但它是其他关系的码,那么该属性集对关系模 式 R 而言是外码。
全码:关系模式的所有属性组是这个关系模式的候选码,称为全码。
关系的三种类型
基本关系 (通常又称为基本表、基表):这是实际存在的表,它是实际存储数据的逻辑表示
查询表:查询结果对应的表
视图表:这是由基本表或其他视图表导出的。由于它本身不独立存储在数据库中,数据库中只存放它的定义,所以常称为虚表
关系数据库模式
关系的描述称为关系模式,可以形式化地表示为
式中: 为关系名; 为组成该关系的属性集合; 为属性的域; 为属性的域的映射集合; 为属性间数据的依赖关系集合。通常将关系模式简记为
式中: 为关系名; 为属性名或域名,属性的域的映像常直接说明属性的类型、长度。通常在关系模式主属性上加下划线表示该属性为主属性。
完整性约束
实体完整性:规定基本关系 的主属性 不能取空值
参照完整性:参照完整性规定,若 是基本关系 的外码,它与基本关系 的主码相对应 (基本关系 和 不一定是同的关系),则对于 中每个元组在 上的值必须为:或者取空值 (F 的每个属性值均为)。或者等于 中某个元组的主码
用户自定义完整性:是针对某一具体的的的关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求,由应用的环境决定
关系运算
集合运算符 含义 并 差 交 笛卡尔积 比较运算符 含义 大于 大于等于 小于 小于等于 等于 不等于 关系运算符 含义 选择 投影 连接 除 逻辑运算符 含义 非 与 或
# 3.2. 5 种基本的关代数运算
并:关系 与 具有相同的关系模式,即 与 的元数相同 (结构相同)。关系 和关系 的并由 或 的元组构成的集合组成,记作,式中, 为元组变量
差:关系 与 具有相同的关系模式。关系 与 的差由 但不属于 的元组构成的集合组成,记作,式中, 为元组变量
笛卡尔积:两个元数分别为 目和 目的关系 和 的广义笛卡尔积是一个 列的元组的集合。元组的前 列是关系 的一个元组,后 列是关系 的一个元组。若 有 个元组, 有 个元组,则关系 和 的广义笛卡尔积有 个元组。记作
投影:从关系的垂直方向进行运算,在关系 中选择出若干属性列 组成新的关系。记作
选择:从关系的水平方向进行运算,是从关系 中选择满足给定条件的诸元,记作 ,式中, 中的运算对象是属性名 (或列的序号) 或常数,运算符是算术比较符和逻辑运算符
设有关系 如下所示,请求出、、、、 和。
关系
| A | B | C |
|---|---|---|
| a | b | c |
| b | a | d |
| c | d | e |
| d | f | g |
关系
| A | B | C |
|---|---|---|
| a | b | c |
| d | f | g |
| f | h | k |
解:、、、、 和 的结果如下面所示。
| A | B | C |
|---|---|---|
| a | b | c |
| b | a | d |
| c | d | e |
| d | f | g |
| f | h | k |
| R.A | R.B | R.C | S.A | S.B | S.C |
|---|---|---|---|---|---|
| a | b | c | a | b | c |
| a | b | c | d | f | g |
| a | b | c | f | h | k |
| b | a | d | a | b | c |
| b | a | d | d | f | g |
| b | a | d | f | h | k |
| c | d | e | a | b | c |
| c | d | e | d | f | g |
| c | d | e | f | h | k |
| d | f | g | a | b | c |
| d | f | g | d | f | g |
| d | f | g | f | h | k |
| A | B | C |
|---|---|---|
| b | a | d |
| c | d | e |
| A | C |
|---|---|
| a | c |
| b | d |
| c | e |
| d | g |
| A | B | C |
|---|---|---|
| a | b | c |
| R.A | R.B | R.C | S.A | S.B | S.C |
|---|---|---|---|---|---|
| a | b | c | d | f | g |
| a | b | c | f | h | k |
| b | a | d | d | f | g |
| b | a | d | f | h | k |
| c | d | e | d | f | g |
| c | d | e | f | h | k |
# 3.3. 扩展的关系代数运算
交
关系 与 具有相同的关系模式。关系 和 的交由属于 同时又属于 的元组构成的集合组成。关系 和 的交记作
显然, 或者 。
连接
连接 (Join) 分为 连接、等值连接和自然连接 种。连接运算是从两个关系的笛卡尔积中选取满足条件的元组。
- 连接。从关系 和 的笛卡尔积中选取属性间满足一定条件的元组。记作
- 等值连接。当 为 “” 时称为等值连接。可以表示为
- 自然连接。是一种比较特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果集中把重属性列去掉。
除
除 (Division) 运算是同时从关系的水平方向和垂直方向进行运算。给定关系 和,X, Y, Z 为属性组。R-S 是满足在 上的分量值 的象集 包含关系 在属性组 上投影的集合。其形式化定义为
式中, 为 在 中的象集,,且 的结果集的属性组为。
设有关系 如图 9-19 所示,求。
R
| A | B | C | D |
|---|---|---|---|
| a | b | c | d |
| a | b | e | f |
| a | b | h | k |
| b | b | d | l |
| b | c | k | d |
| c | c | e | f |
S
| C | D |
|---|---|
| c | d |
| e | f |
R S
| A | B |
|---|---|
| a | b |
| c | k |
广义投影:允许在投影列表中使用算术运算,实现了对投影运算的扩充
若有关系,条件 中的每一个都是涉及 中常和属性的算术表达式,那么广义投影运算的形式定义为
外连接:外连接运算是连接运算的扩展,可以处理缺失的信息。外连接运算有 3 种,即左外连接、右外连接和全外连接
左外连接:取出左侧关系中所有与右侧关系中任一元组都不匹配的元组,用空值 NULL 来填充所有来自右侧关系的属性,构成新的元组,将其加入自然连接的结果中
右外连接:取出右侧关系中所有与左侧关系中任一元组都不匹配的元组,用空值 NULL 来填充所有来自左侧关系的属性,构成新的元组,将其加入自然连接的结果中
全外连接:完成左外连接和右外连接的操作。即填充左侧关系中所有与右侧关系中任一元组都不匹配的元组,填充右侧关系中所有与左侧关系中任一元组都不匹配的元组,将产生的新元组加入连接的结果中
# 4. 关系数据库 SQL 简介
# 4.1. SQL 数据库体系结构
- SQL 的特点
- 综合统一
- 高度非过程化
- 面向集合的操作方式
- 两种使用方式
- 用户可以在终端键盘上输入 SQL 命令,对数据库进行操作,故称之为自含式语言
- 将 SQL 嵌入到高级语言程序中,所以又是嵌入式语言
- 语言简洁,易学易用
- SQL 支持三级模式结构:视图对应外模式、基本表对应模式、存储文件对应内模式。
# 4.2. SQL 的基本组成
- 数据定义语言 (DDL):SQL DDL 提供定义关系模式和视图、删除关系和视图、修改关系模式的命令
- 交互式数据操纵语言 (DML):SQL DML 提供查询、插入、删除和修改的命令
- 事务控制:SQL 提供的定义事务开始和结束的命令
- 嵌入式和动态 SQL:用于嵌入到某种通用的高级语言 (C、C++、Java、PL/I、Cobol、VB 等) 中混合编程。其中 SQL 负责操纵数据库,高级语言负责控制程序流程
- 完整性:SQL DDL 包括定义数据库中的数据必须满足的完整性约束条件的命令,对于破坏完整性约束条件的更新将被禁止
- 权限管理:SQL DDL 中包括说明对关系和视图的访问权限的命令
# 4.3. SQL 数据定义
# 4.3.1. 创建表
CREATE TABLE <表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]...
[,<表级完整性约束条件>]);
2
3
- 列级完整性约束条件有
NULL、UNIQUE,如NOT NULL UNIQUE表示取值唯一,不能取空值
# 4.3.2. 修改表
ALTER TABLE <表名>[ADD<新列名><数据类型>[列级完整性约束条件]]
[DROP <完整性约束名>]
[MODIFY <列名><数据类型>];
2
3
# 4.3.3. 删除表
DROP TABLE <表名>
# 4.3.3. 建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]...);
2
- <次序>:可选升序 (ASC) 或降序 (DSC),默认值为 ASC
- UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录
- CLUSTER:表示要建立的索引是聚集索引,意为索引项的顺序与表中记录的物理顺序一致。
# 4.3.4. 删除索引
DROP INDEX <索引名>;
# 4.3.5. 视图创建
视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。视图不是真实存在的基 础表而是一个虚拟表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中
CREATE VIEW 视图名 (列表名)
AS SELECT 查询子句
[WITH CHECK OPTION];
2
3
- 子查询可以是任意复杂的 SELECT 语句,但通常不允许含有 ORDER BY 子句和 DISTINCT 短语
- WITH CHECK OPTION 表示对 UPDATE、INSERT、DELETE 操作时要保证更新、插入或删除的行满足视图定 义中的谓词条件 (即子查询中的条件表达式)
- 组成视图的属性列名或者全部省略或者全部指定。如果省略属性列名,则隐含该视图由 SELECT 子查询目标 列的主属性组成
# 4.3.6. 视图删除
DROP VIEW 视图名;
# 4.4. SQL 数据查询
# 4.4.1. SELECT 基本结构
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>...]
FROM<表名或视图名>[,<表名或视图名>]
[WHERE<条件表达式>]
[GROUP BY <列名1>[HAVING<条件表达式>]]
[ORDER BY <列名2>[ASC|DESC]];
2
3
4
5
- SQL 查询中的子句顺序: SELECT、FROM、WHERE、GROUP BY、HAVING 和 ORDERBY
- SELECT、FROM 是必需的
- HAVING 子句只能与 GROUP BY 搭配使用
# 4.4.2. 简单查询与连接查询
简单查询:简单查询只需要使用 3 个保留字,即 SELECT、FROM 和 WHERE
连接查询:若查询涉及两个以及以上的表,则称为连接查询
# 4.4.3. 子查询与聚集查询
子查询: 子查询也称为嵌套查询,是指一个 SELECT-FROM-WHERE 查询可以嵌入另一个查询块之中。在 SQL 中允许多重嵌套。
聚集函数:聚集函数是以一个值的集合为输入,返回单个值的函数。SQL 提供了 5 个预定义聚集函数,即平均值 AVG 、最小值 MIN 、最大值 MAX 、求和 SUM 及 计数 COUNT
# 4.4.4. 分组查询
GROUP BY 子句:在 WHERE 子句后面加上 GROUP BY 可以对元组进行分组,保留字 GROUP BY 后面跟着一个分组属性列表。最简单的情况是: FROM 子句后面只有一个关系,根据分组属性对其元组进行分组。SELECT 子句中使用的聚集操作符仅用在每个分组上。
HAVING 子句:假如元组在分组前按照某种方式加上限制,使得不需要的分组为空,则在 GROUP BY 子句后面跟一个 HAVING 子句即可。当元组含有空值时,应注意以下两点:
- 空值在任何聚集操作中都被忽略。它对求和、求平均值和计数都没有影响,也不能是某列的最大值或最小值
NULL值可以在分组属性中看作一个一般的值。
# 4.4.5. 更名运算
SQL 提供了为关系和属性重新命名的机制,这是通过使用具有以下形式的 AS 子句来实现的。
old-name As new-name
AS 子句既可以出现在 SELECT 子句中,也可以出现在 FROM 子句中
# 4.4.6. 字符串操作
对于字符串的最通常的操作是使用 LIKE 操作符的模式匹配。使用两个特殊的字符串描述模式,即 "%" 匹配任意字符串、 "_" 匹配任意一个字符
# 4.4.7. 视图查询
查询视图表时,系统先从数据字典中取出视图的定义,然后将定义中的查询语句和对该视图的查询语句结合起来,形成一个修正的查询语句
# 4.5. SQL 数据更新
# 4.5.1. 插入
INSERT INTO基本表名 [(字段名[,字段名>...])]
VALUE(常量[, 常量]...); 查询语句
INSERT INTO 基本表名 (列表名)
SELECT 查询语句
2
3
4
# 4.5.2. 删除
DELETE FROM 基本表名
[WHERE 条件表达式]
2
# 4.5.3. 修改
UPDATE 基本表名
SET 列名=值表达式[,列名=值表达式...]
[WHERE条件表达式];
2
3
# 4.6. SQL 的访问控制
数据控制是控制用户的存储权利,是由 DBA 来决定的。DBMS 数据控制应具有以下功能:
- 通过
GRANT和REVOKE将授权通知系统,并存入数据字典 - 当用户提出请求时,根据授权情况检查是否执行请求
- SQL 标准包括
DELETE、INSERT、SELECT和UPDATE权限
# 4.6.1. 授权语句
GRANT <权限>[,<权限>...]
[ON<对象类型><对象名>]
To<用户>[,<用户>...]
[WITH GRANT OPTION];
2
3
4
不同类型的操作对象有不同的操作权限:
| 对象 | 对象类型 | 操作权限 |
|---|---|---|
| 属性列 | TABLE | SELECT 、 INSERT 、 UPDATE 、 DELETE 、 ALL PRIVILEGES (4 种权限总和) |
| 视图 | TABLE | SELECT 、 INSERT 、 UPDATE 、 DELETE 、 ALL PRIVILEGES (4 种权限总和) |
| 基本表 | TABLE | SELECT 、 INSERT 、 UPDATE 、 DELETE 、 ALTER 、 INDEX 、 ALL PRIVILEGES (6 种权限总和) |
| 数据库 | DATABASE | CREATE TABLE 建立表的权限,可由 DBA 授予普通用户 |
PUBLIC : 接受权限的用户可以是单个或多个具体的用户, PUBLIC 参数可将权限赋予全体用户
WITH GRANT OPTION : 若指定此子句,获得权限的用户还可以将权限赋予其他用户
# 4.6.2. 收回权限语句
REVOKE<权限>[,<权限>...] [ON<对象类型><对象名>]...
FROM<用户>[,<用户>]...,
2
# 5. 关系数据库规范化
# 5.1. 函数依赖
数据依赖是通过一个关系中属性值间的相等与否体现出来的数据间的相互关系,是现实世界属性间相互联系和约束的抽象,是数据内在的性质,是语义的体现。函数依赖则是一种最重要、最基本的数据依赖
候选码:设 R (U) 是的一个属性集 U 上的关系模式,X 和 Y 是 U 的子集。若对 R (U) 的任何一个可能的关系 r, r 中不可能存在两个元组在 X 上的属性值相等,而在 Y 上的属性值不等,则称 X 函数决定 Y 或 Y 函数依赖于 X,记作
非平凡的函数依赖:如果,但,则称 是非平凡的函数依赖
平凡的函数依赖:如果,但,则称 是平凡的函数依赖
完全函数依赖:在 中,如果,并且对于 的任何一个真子集,都有,则称 对 完全函数依赖,记作
部分函数依赖:如果,但 不完全函数依赖于,则称 对 部分函数依赖,记作。部分函数依赖也称局部函数依赖
传递依赖:在 中,如果, , 不能函数决定, ,则称 对 传递依赖
码:设 R 为 R (U, F) 中的属性的组合,若,且对于 的任何一个真子集,都有,则称 为 R 的候选码,若有多个候选码,则选一个作为主码。候选码通常也称为侯选关键字
主属性和非主属性:包含在任何一个候选码中的属性叫做主属性,否则叫做非主属性
外码:若 R (U) 中的属性或属性组 X 非 R 的码,但 X 是另一个关系的码,则称 X 为外码
函数依赖的公理系统 (Armstrong 公理系统)。设关系模式 R (U,F) 中,U 为属性集,F 是 U 的一组函数依赖,那么有以下的推理规则:
- A1 自反律 (Reflexivity): 若,则 为 所蕴含。
- A2 增广律 (Augmentation): 若,则对于,则 为 所蕴含。
- A3 传递律 (Transitivity): 若,则 为 所蕴含。
根据以上 3 条推理规则,可以推出下面 3 条推理规则。 - 合并规则:若,则 为 所蕴含。
- 伪传递率:若,则 为 所蕴含。
- 分解规则:若,则 及 为 所蕴含。
引理: 成立的充分必要条件是 成立。
# 5.2. 规范化
# 5.2.1. 1NF
- 若关系模式 R 的每一个分量是不可再分的数据项,则关系模式 R 属于第一范式 (1NF)
- 存在问题:冗余度大、引起修改操作的不一致、插入异常、删除异常
# 5.2.2. 2NF
- 若关系模式,且每一个非主属性完全依赖于码,则关系模式 (即 1NF 消除了非主属性对码的部分函数依赖,则称为 2NF)
# 5.2.3. 3NF
- 若关系模式 中不存在这样的码、属性组 及非主属性,使得 成立,则称关系模式 (即 3NF 消除了非主属性对码的传递函数依赖,则称为 3NF)
- 3NF 的模式是 2NF 的模式。产生冗余和异常的两个重要原因是部分依赖和传递依赖。因为 3NF 模式中不存在非主属性的部分依赖和传递函数依赖,所以具有较好的性能。对于非 3NF 的 1NF、2NF,因其性能弱,一般不宜作为数据库模式,通常要将它们变换成为 3NF 或更高级别的范式,这种变换过程称为 “关系模式的规范化处理”。
# 5.2.4. BCNF (巴克斯范式)
- 若关系模式,若,且 属于,则 必含有码,则关系模式 RBCNF (即当 3NF 消除了主属性对码的部分和传递函数依赖,则称为 BCNF)
- 一个满足 BCNF 的关系模式,应具有以下性质
- 所有非主属性对每一个码都是完全函数依赖
- 所有非主属性对每一个不包含它的码,也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任一组属性
1NF
|| 消除非主属性对码的部分函数依赖
\/
2NF
|| 消除非主属性对码的传递函数依赖
\/
3NF
|| 消除主属性对码的部分和传递函数依赖
\/
BCNF
|| 消除非平凡且非函数依赖的多值依赖
\/
4NF
2
3
4
5
6
7
8
9
10
11
12
13
# 5.3. 模式分解及分解应具有的特性
- 分解:关系模式 的一个分解是指,其中,并且没有, 是 在 上的投影,
- 对一个给定的模式进行分解,使得分解后的模式是否与原来的模式等价有 3 种情况:
- 分解具有无损连接性
- 分解要保持函数依赖
- 分解既要无损连接性,又要保持函数依赖
- 无损连接
定义:关系模式 的一个分解 具有无损连接的充分必要的条件是 或。 - 保持函数依赖
定义:设关系模式 的一个分解,如果,则称分解 保持函数依赖。
# 6. 数据库的控制功能
# 6.1. 事务管理
事务是一个操作序列,是数据库环境中不可分割的逻辑工作单位。事务的 4 个特性是原子性、一致性、隔离性和持久性
- 原子性:事务的所有操作在数据库中要幺全做,要幺全都不做
- 一致性:一个事务独立执行的结果,将保持数据的一致性,即数据不会因为事务的执行而被破坏
- 隔离性:一个事务的执行不能被其他事务干扰
- 持久性:一个事务一旦提交,它对数据库中的改变必须是永久的,即便系统出现故障时也是如此
# 6.2. 数据库的备份与恢复
# 6.2.1. 故障类型
- 事务内部故障:事务内部的故障有的可以通过事务程序本身发现
- 系统故障:通常称为 软故障,是指造成系统停止运行的任何事件,使得系统要重新启动
- 介质故障:通常称为 硬故障,如磁盘损坏、磁头碰撞和瞬时强磁干扰。此类故障发生的几率小,但破坏性最大
- 计算机病毒:是一种人为的故障和破坏,是在计算机程序中插入的破坏,计算机功能或者数据可以繁殖和传播的一组计算机指令或程序代码
# 6.2.2. 备份方法
恢复的基本原理是 “建立数据冗余”(重复数据)。建立冗余数据的方法是进行数据转储和登记日志文件。数据的转储分为静态转储和动态转储、海量转储和增量转储
- 静态转储和动态转储:
- 静态转储是指在转储期间不允许对数据库进行任何存取、修改操作
- 动态转储是指在转储期间允许对数据库进行存取、修改操作
- 海量转储和增量转储:
- 海量转储是指每次转储全部数据
- 增量转储是指每次转储上次转储后更新过的数据
- 日志文件:在事务处理的过程中,DBMS 把事务开始、事务结束以及对数据库的插入、删除和修改的每一次操作写入日志文件。一旦发生故障,DBMS 的恢复子系统利用日志文件撤销事务对数据库的改变,退回到事务的初始状态。因此,DBMS 利用日志文件来进行事务故障恢复和系统故障恢复,并可协助后备副本进行介质故障恢复
# 6.2.3. 恢复
- 事务恢复的 3 个步骤:
- 反向扫描日志日志,查找该事务的更新操作
- 对事务的更新操作执行逆操作
- 继续反向扫描日志日志,查找该事务的其他更新操作,并做同样的处理,直到事务的开始标志
# 6.3. 并发控制
并发操作是指在多用户共享的系统中,许多用户可能同时对同一数据进行操作。并发操作带来问题的原因是事务的并发操作破坏了事务的隔离性。DBMS 的并发控制子系统负责协调并发事务的执行,保证数据库的完整性不被破坏,避免用户得到不正确的数据
- 并发操作带来的问题:并发操作带来的数据不一致性有 3 类,即 丢失修改、不可重复读 和 读 “脏” 数据
# 6.3.1. 并发控制技术
- 封锁:并发控制的主要技术
- 排他锁 (X 锁):若事务 T 对数据对象 A 加上 X 锁,则只允许 T 读取和修改 A,其他事务都不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁
- 共享锁 (S 锁):若事务 T 对数据对象 A 加上 S 锁,则只允许 T 读取 A,但不能修改 A,其他事务只能再对 A 加 S 锁,直到 T 释放 A 上的 S 锁
- 三级封锁协议
- 一级封锁协议:事务在修改数据 之前必须先对其加 X 锁,直到事务结束才释放。一级封锁协议可以解决 丢失修改问题
- 二级封锁协议:在一级封锁协议的基础上,加上事务 在读取数据 前必须先对其加 S 锁,读完后即可释放 S 锁。二级封锁协议可以解决 “脏” 数据的问题,但是由于二级封锁协议读完数据后即可释放 S 锁,所以它不能保证可重复读
- 三级封锁协议:在一级封锁协议的基础上,加上事务 在读取数据 之前必须先对其加 S 锁,直到事务结束才释放。三级封锁协议可以防止丢失修改、读 “脏” 数据和不可重复读
# 7. 分布式数据库
- 分片透明:指用户或应用程序不需要知道逻辑访问的表的具体是怎幺分块存储的
- 复制透明:指采用复制技术的分布方法,用户不需要知道数据是复制到哪些节点,如何复制的。
- 位置透明:指用户 无须知道数据存放的物理位置
- 逻辑透明:指用户或应用程序 无需知道局部场地使用的是哪种数据模型共享性:指数据存储在不同的结点数据共享
- 自治性:指每结点对本地数据都能独立管理
- 可用性:当某一场地出现故障时,系统可以使用其他场地上的副本而不至于使整个系统瘫痪
- 分布性:指数据在不同场地上的存储