数据库原理与应用

01 数据

数据是对现实世界信息的抽象。

image-20211109175104863

1-1 数据模型

包括数据结构、数据操作和完整性约束三部分构成。

  • 数据结构 | 数据库中数据的组成、特性及联系,表现为不同的数据模型
    • 关系型数据库
    • 层次结构
    • 网状模型
  • 数据操作 | 增删改查
  • 约束条件 | 数据完整性规则集合

1-2 数据库

数据库(Database, DB)是长期存储在计算机内、有组织、可共享的数据集合。

1-2-1 DBMS

数据库管理系统(Database Management System, DBMS)位于用户与数据库之间的一层管理软件。

  • DBMS的功能
    • 持久存储
    • 数据定义(DDL, Data Definition Language)
    • 数据操作(DML, Data Manipulation Language)(Query Language)
    • 事务管理
    • 运行管理 | 安全性、完整性、并发控制等
    • 维护功能 | 转储、恢复、监视
  • 用户
    • 偶然用户
    • 初级用户 | 应用使用者
    • 高级用户 | 使用数据库语言访问DB
    • 系统分析员
    • 应用程序员 | 编写应用程序(访问DB的程序)

1-2-2 DBS

数据库系统(Database System, DBS)通常等价于DB。

组成情况

image-20211109193916365

1-3 模式结构

三层模式,两级映射

image-20211109194400565

1-3-1 模式

模式(逻辑模式)是数据库中全体数据的逻辑结构和特征的描述,一个数据库只有一种模式。

其定义包括 1) 数据的逻辑结构(数据项的名字、类型、取值范围等);2) 数据间的联系;3) 安全性完整性要求。

外模式 | 子模式/用户模式。

1-3-2 映射

① 外模式-模式

保证数据的逻辑独立性。

模式改变时,改变外模式-模式的映射即可,外模式保持不变,即应用程序不必修改。

② 模式-内模式

定义了数据全局逻辑结构与物理存储结构之间的对应关系。映射是唯一的。

保持数据的物理独立性。

1-4 数据模型

模型是对现实世界特征的模拟和抽象。

两种类型的数据模型 1) 语义数据模型;2) 经典数据模型。

  • 语义数据模型 | 现实世界到信息世界的第一层抽象
    • 实体联系模型(ER模型)
    • 面向对象模型
  • 经典数据模型 | 基于记录的模型
    • 网状模型
    • 层次模型
    • 关系模型

1-4-1 实体联系模型

实体 Entity; 属性 Attribute; 键 Key (主键 外键); 域 Domain; 实体型 Entity Type; 实体集 Entity Set; 联系 Relationship

示例

image-20211109203703992

1-4-2 关系模型

例1:学生、系,系与学生之间的一对多联系:

学生(学号,姓名,年龄,性别,系号,年级)
系 (系号,系名,办公地点)

例2:系、系主任,系与系主任间的一对一联系
系 (系号,系名,系主任名,办公地点)

例3:学生、课程、学生与课程之间的多对多联系:

学生(学号,姓名,年龄,性别,系号,年级)
课程(课程号,课程名,学分)
选修(学号,课程号,成绩)

1-4-3 层次模型

满足条件 1) 有且仅有一个无双亲的根节点;2) 其他结点有且仅有一个双亲结点。

image-20211109204049250

示例

image-20211109204156824

存储结构

  • 邻接法 | 按照层次树前序遍历的顺序把所有记录值相邻存放
  • 链接法 | 用指引元来反映数据之间的层次联系

1-4-4 网状模型

满足条件 1) 允许结点无双亲;2) 一个结点可有多个的双亲。

示例

image-20211109204810673

  • 优点
    • 能更直接地描述现实世界(如一个结点可以有多个双亲)
    • 有良好的性能,存取效率较高
  • 缺点
    • 结构复杂,且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌握
    • DDL、DML语言复杂,用户不容易使用

02 关系数据库

支持关系模型的数据库系统。

关系模型的组成:1) 关系数据结构;2) 关系操作集合;3) 关系完整性约束。

2-1 一些定义

关系是笛卡尔积的有限子集。

2-1-1 关系

域(Domain);笛卡尔积(Cartesian Product);关系(Relation)。

  • Domain | 一组具有相同数据类型的值的集合
  • 笛卡尔积 | 所有域的所有不重复取值的一个组合的集合
  • 关系 | 基本关系;查询表;视图

重点 笛卡尔积

给定一组域D1,D2,…,Dn,这些域中可以有相同的。

D1,D2,…,Dn的笛卡尔积为:D1×D2×…×Dn={(d1,d2,…,dn)|di∈Di,i=1,2,…,n}

元组

笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简称元组。

分量

笛卡尔积元素(d1,d2,…,dn)中的每一个值di叫作一个分量。

基数

  • 域的基数 | 域中所包含的值的个数
  • 笛卡尔积的基数 | 域基数累积

示例

D1 = { ‘张敏’, ‘李延’, ‘王晓红’ }; D2 = { ‘男’, ‘女’ }

image-20211109210345520

2-1-2 关系模式

关系的形式化描述:

1
2
3
4
5
6
R(U, D, dom, F)
//R 关系名
//U 组成该关系的属性名集合
//D 属性组U中属性所来自的域
//dom 属性向域的映象集合
//F 属性间的数据依赖关系集合

在一个给定的应用领域中,所有实体及实体之间联系的关系的集合构成一个关系数据库。

2-1-3 关系的完整性

  • 实体完整性 | 主属性不为空
  • 参照完整性 | 关系即实体间的引用;外键
  • 用户定义的完整性 | 具体应用所涉及数据必须满足的语义要求

2-2 关系代数

一种抽象的查询语言,用对关系的运算来表达查询。实操类似联合查询

  • 传统集合运算 | 并、差、交、广义笛卡尔积
  • 专门关系运算 | 选择、投影

2-2-1 传统集合运算

  • | R∪S = { t | t∈R ∨ t∈S }
  • 差 | R - S = { t | t∈R ∧ t∉S }
  • | R∩S = { t | t∈R ∧ t∈S }
  • 笛卡尔积 | R×S = { tr ts | tr∈R ∧ ts∈S }

2-2-2 专门关系运算

  • 选择 | σF(R) = { t | t∈R ∧ F (t)= ‘true’ } 也称限制
  • 投影 | πA(R) = { t[A] | t∈R } A是R中的属性列
  • 连接 | R ⋈(AθB) S = { tr ts | tr∈R ∧ ts∈S ∧ tr[A]θts[B] }
    • 从R和S的广义笛卡尔积R×S中选取
    • R关系 在A属性组上的值与 S关系 在B属性组上值满足比较关系的元组。
    • 等值连接、自然连接
  • 除 | R÷S = { tr [X] | tr∈R ∧ πY(S)∈Yx } Yx是x在R中的象集

2-3 关系演算

2-3-1 元组关系演算

元组变量作为谓词变元的基本对象;元组关系演算语言ALPHA。

{ t | P(t) } 表示满足公式P的所有元组t的集合。

语句

  • 检索语句 | GET
  • 更新语句 | PUT,HOLD,UPDATE,DELETE,DROP

2-3-2 域关系演算

域变量作为谓词变元的基本对象;域关系演算语言QBE。

Query By Example

域关系演算的结果是符合给定条件的域变量值序列的集合,也就是一个关系。

xθy,其中x,y是常量或域变量,但至少有一个是域变量,θ是算术比较运算符。

2-4 关系数据库标准语言

SQL结构化查询语言 Structured Query Language

一些基本概念

  • 数据定义语言DDL | CREATE, DROP
  • 交互式数据操纵语言DML | SELECT, INSERT, UPDATE, DELETE
  • 完整性控制 Integrity | 破坏
  • 事务控制 Transaction Control | COMMIT, ROLLBACK
  • 权限管理 Authorization | GRANT, REVOKE
  • 嵌入式SQL和动态SQL | 用于通用编程语言中

概念2

  • 基本表 Table | 独立存在的实际表
  • 视图 View | 从一个或几个基本表中导出的虚表
  • 列 | 实体的一个属性
  • 游标 | 指示器
  • 集函数 | 一些统计函数,如最大值、最小值、平均值、个数、总和等
  • 值表达式 | 含有列名、集函数、值说明及算术运算符等
  • 谓词 | 指明条件
  • 子查询 | 嵌套

2-4-1 数据定义

image-20211110105942416

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 创建表 --
CREATE TABLE Department
(Dno INT NOT NULL UNIQUE,
Dname CHAR(16) NOT NULL,
Daddress CHAR(30),
ManagerID INT);

-- 删除表 --
DROP TABLE Department;

-- 修改表 --
ALTER TABLE Employee
DROP UNIQUE (Ename); -- [DROP完整性约束名]
-- ADD新列名 数据类型 [列级完整性约束条件]
-- [MODIFY列名 数据类型]

-- 创建索引 --
CAEATE [UNIQUE] [CLUSTER]
INDEX 索引名
ON 表名(列名[次序][,列名[次序]]…)
[其他参数];

-- 删除索引 --
DROP INDEX 索引名;

2-4-2 查询

image-20211110112005989

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
-- 查询 --
SELECT [ALL|DISTINCT]目标列表达式[,目标列表达式]…
FROM 基本表或视图[,基本表或视图]…
[WHERE 条件表达式]
[GROUP BY 列名1[HAVLNG 内部函数表达式]]
[ORDER BY列名2 [ASC/DESC]];

-- 等值连接 --
SELECT Employee.*, Works.*
FROM Employee, Works
WHERE Employee.Eno = Works.Eno;

-- 自然连接 --
SELECT Employee.*, Pno, Salary
FROM Employee, Works
WHERE Employee.Eno = Works.Eno;

-- 复合条件连接 --
SELECT Employee.Eno, Ename
FROM Employee,Works
WHERE Employee.Eno =Works.Eno /* 连接谓词 */
AND Pno=301 AND Salary>50; /* 其他限定条件 */

-- 自身连接 --
SELECT First.Ename as '员工', Second.Ename AS '经理'
FROM Employee First, Department, Employee Second
WHERE First.Dno = Department.Dno
AND Department .ManagerId = Second.Eno;

-- 外连接 --
SELECT Employee.*, Pno, Salary
FROM Employee FULL OUTER JOIN Works
on Employee.Eno = Works.Eno;

-- 嵌套查询 --
SELECT Ename /*外层查询/父查询*/
FROM Employee
WHERE Eno IN
(SELECT Eno /*内层查询/子查询*/
FROM Works
WHERE Pno = '308');

-- 谓词 --
SELECT Ename
FROM Employee
WHERE EXISTS -- 存在 NOT EXISTS
(SELECT Pno
FROM Works
WHERE Employee.Eno= Works.Eno
AND Pno= '308');

集合查询

1
2
3
4
5
6
7
8
9
-- 并操作 --
-- <查询块> UNION <查询块> --
SELECT * FROM Employee WHERE Dno=101
UNION
SELECT * FROM Employee WHERE Eindate>'2003-1-1';


-- 交操作 --
SELECT DISTINCT * FROM Employee WHERE Dno=101 AND Eindate>'2003-1-1';

2-4-3 视图操作

虚表,是从一个或几个基本表(或视图)导出的表。

只存放视图的定义,不会出现数据冗余。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];

-- 单表导出视图 --
CREATE VIEW Employee_V1
AS SELECT *
FROM Employee
WHERE Esex='女';

-- 多表导出视图 --
CREATE VIEW Works_v1
AS SELECT Ename, Pname, Salary
FROM Employee, Works, Project
WHERE Employee.Eno = Works.Eno
AND Works.Pno = Project.Pno;

-- 视图导出视图 --
CREATE VIEW Employee_V1_V1
AS SELECT Eno, Ename, Esex
FROM Employee_v1;

-- 表和视图导出视图 --
CREATE VIEW Works_V2
AS SELECT Employee_v1.Eno, Pno, Salary
FROM Employee_v1, Works
WHERE Employee_V1.Eno = Works.Eno;

-- 删除视图 --
DROP VIEW Employee_v1;

视图查询

先从数据字典中取出视图的定义;再把视图定义中的子查询与用户的查询结合起来。

1
2
3
4
5
6
7
SELECT * FROM Employee_V1			-- 前Employee_V1的定义 WHERE Esex='女';
WHERE Eaddress LIKE ‘北区%’;

-- 等价查询 --
SELECT * FROM Employee
WHERE Esex = '女'
AND Eaddress LIKE '北区%';

2-4-4 数据操作

增删改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- * * 新增数据 * * --
-- 示例 --
-- INSERT
-- INTO <表名> [(<属性列1>[, <属性列2 >…)]
-- VALUES (<常量1> [, <常量2>] … )

INSERT INTO Works(Eno,Pno) VALUES ('200506','321');

-- 子查询插入 --
INSERT INTO Abstract_Employee
SELECT Eno, Ename, Dno
FROM Employee;

-- * * 删除数据 * * --
-- 示例 --
-- DELETE FROM <表名> [WHERE <条件>];

DELETE FROM Works WHERE Eno = 200005;

-- 子查询删除 --
DELETE FROM Employee WHERE NOT EXISTS
(SELECT * FROM Works
WHERE Employee.Eno = Works.Eno)

-- * * 更新数据 * * --
-- 示例 --
-- UPDATE <表名>
-- SET <列名>=<表达式> [, <列名>=<表达式>]…
-- [WHERE <条件>];

UPDATE Employee SET Dno=103 WHERE Ename='李梅';

2-4-5 数据控制

安全控制,使一个用户对不同的对象有不同的操作权限。

授权 and 回收权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- 授权 --
-- 示例 --
-- GRANT 权限 [,权限]...
-- [ON 对象类型 对象名]
-- TO 用户[,用户]...
-- [WITH GRANT OPTION];

GRANT SELECT
ON TABLE Employee
TO USER1;

GRANT INSERT
ON TABLE Project
TO USER6
WITH GRANT OPTION;

-- 回收 --
-- 示例 --
-- REVOKE 权限 [,权限]...
-- [ON 对象类型 对象名]
-- FROM 用户 [,用户]...;

REVOKE UPDATE(Eno)
ON TABLE Employee
FROM USER4;

REVOKE INSERT
ON TABLE Project
FROM USER6;

2-4-6 SQL嵌入

嵌入式SQL是将SQL嵌入到高级语言中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
EXEC SQL INCLUDE SQLCA;			/* (1) 定义SQL通信区 */
EXEC SQL BEGIN DECLARE SECTION; /* (2) 说明主变量 */
INT Eno;
CHAR Ename (10);
INT Dno;
EXEC SQL END DECLARE SECTION;

main()
{
EXEC SQL DECLARE C1 CURSOR FOR /* 游标操作(定义游标) */
SELECT Eno, Ename, Dno FROM Employee; /* 从Employee表中查询Eno,Ename,Dno */

EXEC SQL OPEN C1; /* (4) 游标操作(打开游标)*/

for(;;)
{
/*游标操作(将当前数据放入主变量并推进游标指针)*/
EXEC SQL FETCH C1 INTO :Eno,:Ename,:Dno;
/*利用SQLCA中的状态信息决定何时退出循环*/
if (sqlca.sqlcode <> SUCCESS)
break;
/*打印查询结果*/
printf("员工号: %d, 姓名: %s,部门号:%d ", :Eno,:Ename,:Dno);
}
EXEC SQL CLOSE C1; /*游标操作(关闭游标)*/
}

03 ★关系数据库理论

单表或者可能存在的一些问题

1、数据冗余太大;

2、插入异常(Insertion Anomalies):该插的数据插不进去。

3、删除异常(Deletion Anomalies):不该删除的数据不得不删。

4、更新异常(Update Anomalies):更新数据时,维护数据完整性代价大。会产生数据不一致现象。

需要规范化

分解关系模式来消除其中不合适的数据依赖,消除上述问题。

3-1 数据依赖

是否通过关系中一个属性间值体现出数据间相互依赖、相互制约的关系。

3-1-1 函数依赖

Functional Dependency

设有R(U),X和Y是U的子集,R(U)的任一可能的关系r。

r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等;则称 “X函数确定Y” 或 “Y函数依赖于X”,记作X→Y。

3-1-1-1 平凡函数依赖 与 非平凡函数依赖

如X→Y,但Y ⊈ X,则称X→Y是非平凡的函数依赖
若X→Y,但Y ⊆ X,则称X→Y是平凡的函数依赖

示例

非平凡函数依赖: (Eno, Pno) → Salary

平凡函数依赖:(Eno, Pno) → Eno;(Eno, Pno) → Pno

3-1-1-2 完全函数依赖 与 部分函数依赖

如果X→Y,并且对X的任一真子集X’,都有Y不依赖X’,则称Y完全函数依赖于X,记作X → (F) Y。

若X→Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X,记作X → (P) Y。

3-1-1-3 传递函数依赖

如果X→Y,X不依赖于Y ,Y→Z,且Y⊈X,则称Z传递函数依赖于X,记作:X → (T) Z 。

3-1-2 多值依赖

Multivalued Dependency ( ̄﹏ ̄;) 有些没太弄懂。

设有R(U),X,Y和Z是U的子集,且Z=U-X-Y。R(U)的任一可能的关系r。

若对于关系r 在X上的一个确定的值,都有r在Y中一组值与之对应,且Y的这组对应值与r在Z中的属性值无关;则称Y多值依赖于X,记为X→→Y。

若X→→Y,但Z≠Φ,则称为非平凡多值依赖,否则称为平凡多值依赖。

3-2 范式

数据库规范化过程中不同程度的规范化要求设立不同的标准。Normal Form.

第一范式(1NF) ⊃ 第二范式(2NF) ⊃ 第三范式(3NF) ⊃ BC范式(BCNF) ⊃ 第四范式(4NF) ⊃ 第五范式(5NF)。

image-20211110205228787

3-2-1 1NF

R的所有属性都是不可分的基本数据项。

它规定了一个关系中的属性值必须是“原子”的 。

3-2-2 2NF

在1NF基础上,每一个非主属性都完全函数依赖于R的主键。

3-2-3 3NF

在2NF基础上,每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。

3-2-4 BCNF

在3NF基础上,R中的所有属性(主,非主属性)都完全函数依赖于码。

  • 所有非主属性都完全函数依赖于每个候选码
  • 所有主属性都完全函数依赖于每个不包含它的候选码
  • 没有任何属性完全函数依赖于非码的任何一组属性

3-2-5 4NF

如果关系模式R∈1NF,且对于R的每个非平凡多值依赖X→→Y (X不包含Y),X都含有候选码。

  • 4NF中可能的多值依赖都是平凡多值依赖。
  • 4NF中所有的函数依赖都满足BCNF。
    • 因为关系模式R(U)上的函数依赖X→Y可以看作多值依赖X→→Y

3-3 数据依赖的公理系统

【略】

Armstrong公理系统

函数依赖闭包

极小化过程

3-4 模式分解

【略】


04 数据库设计

在给定应用环境中,构造一个合适的数据库模式,建立数据库满足应用需求。

主要分为 1) 结构设计(静态模型设计);2) 行为设计(应用程序设计/动态模型设计)。

设计步骤

image-20211110211204139

image-20211110211631650

image-20211110211715681

4-1 需求分析

数据流图;数据字典;业务流程图。

分析得到 1) 数据项;2) 数据流;3) 数据存储;4) 数据处理。

4-2 概念结构设计

将需求分析得到的用户需求抽象为信息结构(即概念模型)。

主要步骤 1) 数据抽象,建立局部E-R模型 ;2) 将局部概念模式综合,形成全局E-R模式;3) 对全局E-R模式进行优化、验证,消除不必要的冗余和不一致性;4) 提交评审。

4-3 逻辑结构设计

把设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。

image-20211110214623223

4-4 物理设计

为关系模式选择存取方法(建立存取路径);设计关系索引等数据库文件的物理存储结构

image-20211110215111744

  • 存取方法
    • 数据库系统是多用户共享的系统,对同一个关系要建立多条存取路径才能满足多用户的多种应用要求
    • 确定选择哪些存取方法,即建立哪些存取路径
    • 常用方法 | 索引、聚簇(Cluster)、Hash方法
  • 存储结构
    • 确定数据的存放位置和存储结构( 关系、 索引、 聚簇、 日志、 备份)
    • 确定系统配置

4-5 数据库的实施和维护

物理系统的实施;程序代码设计与测试;项目管理(文档准备);人员培训;数据准备与装入;系统转换与评价。


05 事务处理技术

事务(Transaction)在DBMS中,是数据库应用程序的基本逻辑处理单元,它可以是一条SQL语句、一组SQL语句或整个程序。

具有ACID性质。

  • A | Atomicity 原子性,事务是DB应用执行的基本单元,要么执行、要么不执行
  • C | Consistency 一致性,满足完整性约束,使数据库从一个一致性状态变到另一个一致性状态
  • I | Isolation 隔离性,一事务的执行不被另一事务影响
  • D | Durability 持久性,一旦提交DB中数据的改变就应该是永久性的

在SQL语言中,定义事务的语句有三条:

1
2
3
4
BEGIN TRANSACTION
COMMIT
ROLLBACK
-- 事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束

5-1 数据恢复

数据故障不可避免,包括1) 系统故障,软硬件;2) 人为故障,失误和破坏。

数据恢复,是把数据库从错误状态恢复到某一已知的正确状态(亦称为一致状态或完整状态)。

故障分类

  • 事务内部故障 | 程序的错误执行,异常,发生在单个事务中。
  • 系统故障 | 引起系统停止运转需要重新启动
  • 介质故障 | 主要是外存设备故障
  • 计算机病毒

恢复操作的基本原理:冗余。

恢复机制的关键问题:1) 如何建立冗余数据(数据转储 和 日志文件)及 2) 如何用这些冗余数据实施恢复。

5-1-1 数据转储

Backup

DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程,备用的数据称为后备副本或后援副本。

静态转储 | 系统无运行事务时进行转储操作

  • 转储期间不允许任何操作
  • 得到的一定是一致性副本

动态转储 | 与用户事务并发进行

  • 不等待正在运行的用户事务结束
  • 不能保证副本中数据的正确有效
  • 需把动态转储期间各事务的活动登记下来,建立日志文件

海量转储 | 每次转储全部数据库数据

增量转储 | 只转储新更新过的数据

image-20211111101748130

5-1-2 日志文件

Logging

日志文件(log)用来记录事务对数据库的更新操作的文件。

  • 以记录为单位的日志文件
    • 事务标识(标明是哪个事务)
    • 操作类型(插入、删除或修改)
    • 操作对象(记录内部标识)
    • 更新前数据的旧值(对插入操作而言,此项为空值)
    • 更新后数据的新值(对删除操作而言, 此项为空值)
  • 以数据块为单位的日志文件
    • 事务标识(标明是哪个事务)
    • 被更新的数据块

5-1-3 恢复策略

① 事务故障

恢复子系统应利用日志文件撤消(UNDO)此事务已对数据库进行的修改。

系统自动完成,对用户透明,不需要用户干预。

  • 反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。
  • 对该事务的更新操作执行逆操作。即将日志记录中“更新前的值” 写入数据库。
  • 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。
  • 如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。

② 系统故障

未完成事务对数据库的更新已写入数据库;已提交事务对数据库的更新还留在缓冲区没来得及写入数据库。

  • Undo 故障发生时未完成的事务
  • Redo 已完成的事务

对用户透明,系统故障的恢复由系统在重新启动时自动完成,不需要用户干预。

③ 介质故障

  • 装入最近的备份数据库副本
  • 装入日志文件副本,重做已完成的事务

④ 检查点技术

具有检查点(Checkpoint)的恢复技术

  • 在日志文件中增加检查点记录
  • 增加重新开始文件
  • 恢复子系统在登录日志文件期间动态维护日志

检查点记录内容

  • 建立检查点时刻所有正在执行的事务清单
  • 这些事务最近一个日志记录的地址

image-20211111110646987

⑤ 数据库镜像

为预防介质故障,DBA必须周期性地转储数据库。

数据库镜像(Mirror)是提高数据库可用性的解决方案。DBMS自动把整个数据库或其中的关键数据复制到另一个磁盘上。

image-20211111111524868

出现介质故障时,可由镜像磁盘继续提供使用、恢复原数据库、不需要关闭系统和重装数据库副本。

没有故障时,可用于并发操作,读镜像数据库上的数据,而不必等待该用户释放锁。

缺点

频繁地复制数据自然会降低系统运行效率。

5-2 并发控制

并发是为提高系统利用率,缩短事务响应时间。

并发导致的问题

1) 丢失更新(Lost Update)

image-20211111113222567

2) 读脏数据(Dirty Read)

image-20211111113321026

3) 不可重复读(Unrepeatable Read)

image-20211111113434763

引入锁机制

5-2-1 锁

分类 1)排他锁(X锁)和 2)共享锁(S锁)

image-20211111113745429

5-3-2 锁协议

1) 一级锁协议

事务T在修改数据R之前必须先对其加X锁,直到事务结束才能释放。解决丢失更新问题。

其中事务结束包括正常结束(Commit)和非正常结束(Rollback)。

image-20211111114455957

2) 二级锁协议

在一级锁协议基础上,规定事务在读取数据之前应先对其加S锁,读完释放。

不但解决丢失更新问题,还可以进一步防止读“脏”数据。

image-20211111114823647

3) 三级锁协议

在一级锁协议的基础上,规定事务在读取数据之前必须先对其加S锁。

读完后并不释放S锁,直到事务结束后才释放。解决不可重复读问题。

image-20211111115427662

5-3-3 死锁

互相等待。

image-20211111144727046

1) 预防

  • 要求每个事务在执行之前封锁它所需要的数据对象,否则就执行
  • 预先对数据对象规定一个封锁顺序,每个事务都按照这个顺序实行封锁。

2) 检测与解除

锁超时法

等待图法 等待图(Wait-For Graph)是一个有向图 G=( T, U);

其中T为结点的集合,T={ Ti |Ti是当前正在运行的事务, i=1, 2, …, n };

U为边的集合,U={ (Ti, Tj) | Ti 等待 Tj, i≠j }。

如果等待图中存在回路,就表示系统中出现了死锁。为了检测死锁,DBMS需要维护等待图,并周期性地调用一个在等待图中搜索回路的算法。

image-20211111145703453

5-3-4 两段锁协议

在一个事务中,如果加锁都限制在释放锁之前,那么这个事务被称为两段事务(two-phase transaction)。

上述加锁限制称为两段锁协议(Two-Phase Locking Protocol,简称2PL协议)。

  • 在对任何数据对象进行读写操作之前,事务必须获得对该数据对象的封锁;
  • 在释放一个封锁之后,事务不再申请和获得任何其他封锁。

image-20211111150451687

5-3-5 锁的粒度

封锁的数据对象的大小就称为封锁粒度(Granularity)。封锁对象可以是逻辑单元,也可以是物理单元。

可以是属性值、属性值集合、元组、关系、索引项、整个索引以及整个数据库等逻辑单元;也可以是页(数据页或索引页)、块等物理单元。

5-3-6 显式封锁与隐式封锁

显式封锁(Explicit Locking)与隐式封锁(Implicit Locking

  • 显式 | 系统应事务要求,直接加锁于数据对象
  • 隐式 | 数据对象本身没有独立加锁,而因它的上级被封锁而封锁

5-3-7 意向锁

Intention Lock

如果对一个数据对象加意向锁,则说明该数据对象的下级正在被加锁。

对任一数据对象加锁时,须先对它的所有上级加意向锁。

SIX锁相当于加了S锁,再加上IX锁,即SIX=S+IX

image-20211111151156709


06 安全性与完整性

6-1 安全性

  • 物理层 | 机房在物理上受到保护。
  • 人际层 | 减少管理及使用人员接受贿赂而给入侵者提供访问的机会。
  • 操作系统层 | 操作系统的安全性的弱点会成为入侵者未授权访问的手段。
  • 网络层 | 网络进行远程访问,如SQLServer被设计为为C/S模式。
  • 数据库系统层 | 数据库系统本身需要提供一种安全机制来保证合法的用户使用合法的权限来访问和修改数据。

6-1-1 自主存取控制

大型数据库系统几乎都支持自主存取控制(Discretionary Access Control, DAC)机制。

定义存取权限

image-20211111152408354

示例

image-20211111152516460

检查存取权限

DBMS查找数据字典,根据其存取权限对操作的合法性进行检查。

授权粒度

授权粒度是指可以定义的数据对象的范围。

image-20211111152813359

6-1-2 强制存取控制

强制存取控制(MAC)是指系统为保证更高程度的安全性,按照TDI/TCSEC标准中安全策略的要求,所采取的强制存取检查手段。

MAC适用于对数据有严格而固定密级分类的部门(军事、政府部门)。

主体和客体

在MAC中,DBMS所管理的全部实体被分为主体和客体两大类。

敏感度标记

绝密(Top Secret);机密(Secret);可信(Confidential);公开(Public)

规则

  • 仅当主体的许可证级别大于或等于客体的密级时,该主体才能取相应的客体;
  • 仅当主体的许可证级别等于客体的密级时,该主体才能相应的客体。

6-2 完整性

数据库中的完整性是指数据的正确性、有效性和相容性。

DBMS应提供定义数据库完整性约束条件,并把它们作为模式的一部分存入数据库中。

作用对象

列、元组、关系。分为静态和动态,对动态对象的约束是反映数据库状态变迁的约束。

粒度状态 列 级 元 组 级 关 系 级
静态 列定义 ·类型 ·格式 ·值域 ·空值 元组值应满足的条件 实体完整性约束 参照完整性约束 函数依赖约束 统计约束
动态 改变列定义或列值 元组新旧值之间应满足的约束条件 关系新旧状态间应满足的约束条件

6-2-1 DBMS的完整性控制机制

包含三个部分 1) 定义功能;2) 检查功能;3) 违约功能。

完整性规则五元组表示:(D, O, A, C, P)

  • D(Data)| 约束作用的数据对象;
  • O(Operation)| 触发完整性检查的数据库操作
  • A(Assertion)| 数据对象必须满足的断言或语义约束这是规则的主体;
  • C(Condition)| 选择A作用的数据对象值的谓词
  • P(Procedure)| 违反完整性规则时触发的过程

关系系统三类完整性的实现

  • 定义和检查实体完整性
  • 参照完整性
    • 外键
  • 用户定义的完整性

【完结】

dark
sans