本文最后更新于 2023-10-12,文章内容可能已经过时。

数据库系统

1.概论

1.1 数据库:

是长期储存在计算机内、有组织的、可共享的数据集合.

1.2 数据库管理系统:

管理数据库,支持应用的软件系统 DataBase Management System (DBMS).

image-20230608111714224

1.3 数据库系统:

image-20230608111745493

1.4 文件系统的劣势:

数据冗余和不一致

数据访问困难

传统文件处理环境不支持方便而高效的方式去获取数据,不能对变化的需求做出更快的反应。

数据孤立

数据分散在不同文件中,这些文件又可能具有不同的格式,因此编写新的应用程序来检索适当数据是很困难的.

完整性问题

数据库所存储的数据值必须满足某些特定一致性约束文件系统中,新的约束加入时,很难通过修改程序来体现这些新约束,当约束涉及到不同文件中的多个数据项时,问题更为复杂.

原子性问题

操作是原子的:为了保证数据库的一致性,一些操作要么全部发生、要么根本不发生,例如:转账在传统文件处理系统中,很难保持上述原子性。

并发访问异常

了提高系统的总体性能及加快响应速度,许多系统需要允许多个用户同时更新数据,在文件系统中,数据可能被多个不同应用程序访问,这些程序相互间事先没有协调,管理就很难进行.

安全性问题

并非数据库系统的所有用户都可以访问所有数据,由于文件系统中应用程序总是即席地加入到文件处理系统中来,这样的安全性约束难以实现.

image-20230608112155934

1.5 数据库系统结构:

image-20230608112221435

1.6 数据抽象:

对于用户系统地隐藏关于数据存储和维护的某些细节,屏蔽复杂性,简化用户与系统的交互.

1.6.1 视图抽象:

image-20230608112434463

1.6.2 逻辑抽象:

image-20230608112502106

1.6.3 物理抽象:

image-20230608112527896

1.7 数据独立性:

1.7.1 物理数据独立性:

image-20230608112621203

1.7.2 逻辑数据独立性:

image-20230608112646064

1.8 数据模型:

image-20230608112714623

常用的数据模型:

image-20230608112741975

1.8.1 层次数据模型:

有且只有一个结点没有双亲结点,这个结点称为根结点,根以外的其它结点有且只有一个双亲结点.

一个例子:
image-20230608112857743

优缺点:

image-20230608112850291

1.8.2 网状数据模型:

image-20230608112935942

优缺点:

image-20230608113001074

1.9 数据库语言:

image-20230608113028790

2.关系数据库:

2.1 关系模型:

image-20230608113142099

2.2 关系数据结构的基本概念:

2.2.1属性:

关系表的列,顺序无关紧要

2.2.2域:

属性的所有可能取值的集合,称为该属性的域

2.2.3关系:

image-20230608113500259

笛卡尔积中的每一个元素称为一个元组.

image-20230608113551262

2.2.4关系模式:

关系的型.

image-20230608113659892

注意此处的关系是数据库字段之间的关系.

举个例子:

image-20230608113727645

2.2.5 关系数据库:

image-20230608113801270

2.3 完整性约束:

2.3.1 超码:

唯一的标识一个元组.

2.3.2 候选码:

超码.且真子集不是超码.一个关系模式可以有多个候选码.

2.3.3 主键(主码):

被数据库设计者选中的,用来在同一关系中区分不同元组的候选键.

选择原则:值从不或很少变化的.

一个关系模式只能具有一个主键,主键中的属性称为关系的主属性.

2.3.4 外键(外码):

主键在其他表中.

image-20230608114144524

外键并不一定要与相应的主键同名。

一般情况下,外键与相应的主键往往取相同的名字,以便于识别.

2.3.5 实体完整性约束:

主键不能为空.

2.3.6 关联完整性约束:

外键的值必须有对应的主键.

2.4 关系运算:

2.4.1 关系代数运算:

选择:选出若干行

投影:选出若干列

并:合并元组

差:减去元组

笛卡尔积:列相乘

关系代数的基本运算足以表达任何关系代数查询,但是,如果我们把自己局限于基本运算,某些常用的查询表达出来会显得冗长.

因而,我们定义了一些附加运算,它们不能增加关系代数的表达能力,却可以简化一些常用的查询.

2.4.2 附加关系代数运算:

交:交集

连接:

选取属性间满足一定关系的元组.

2.4.2.1 等值连接:

image-20230608154559943

2.4.2.2 自然连接:

匹配不上的就不要了.

image-20230608154641166

2.4.2.3 左外连接:

匹配不上的只保留左边.

image-20230608154812044

右边外连接也是一样的,两个连接的交集是全外连接.

2.4.3 拓展关系代数运算:

image-20230608155049714

2.5 元组关系演算:

image-20230608155139015

举几个例子:

image-20230608155201419

2.6 关系运算安全性:

如果一个关系运算系统不产生无限关系和无穷验证,则这个运算是安全的.

关系代数系统是安全的,元组关系演算不安全.这两种运算之间具有等价性.

关系运算是关系数据库查询语言的基础.

2.7 SQL:

结构化查询语言.

image-20230608230625061

2.7.1 DDL:

1
2
3
4
5
6
7
创建:
create table/view/index
删除:
drop
修改:
alter table
视图和索引不能修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table 表名(
列名 数据类型,
...
);

CREATE TABLE Grade
(
//不为空约束
SSN CHAR(9) NOT NULL,
CNO CHAR(7) NOT NULL,
Score INTEGER,
//指定主键
Primary key (SSN, CNO),
//指定外键
foreign key(SSN) references Student);

image-20230608230930095

1
create unique index 索引名 on 表名(索引字段)

2.7.2 授权:

1
2
3
4
5
6
7
增添
grant 权限 on 关系 to 用户
取消
revoke 权限 on 关系 from 用户


grant select on table student to bob;
1
2
3
4
5
6
7
8
9
10
11
12
角色授权方式:
方便:将系统权限与用户的对象权限都封装在角色中;谁要用的话直接把角色赋给它们就行。
这种权限称为可传播的

//创建角色
create role manager;

//为角色赋予权限
grant create session,create table,create view to manager;

//角色权限给用户
grant manager to bob;

2.7.3 查询:

2.7.3.1 单表查询:

image-20230608231306012

1.消除重复:distinct 只用一次就行。

2.谓词一览:image-20230608231541008

3.order by:

放在查询语句的最后,先写orderby +列名,再写策略:

image-20230608231744733

4.聚集查询:

image-20230608231828078

位置在select后面,举例如下:

1
2
3
4
5
统计学生总人数.
Select count(*) From student;

查询选修了课程的学生人数.
Select count(distinct Sno) From SC;

5.分组:

最后,只能出现分组属性和聚集函数。

1
2
3
4
5
Select dept_name, Max(salary)
From Employee
Where age》25
Group by dept_name;
age

having:作用于分组:

1
2
3
4
5
Select dept_name, Max(salary)
From Employee
Where age>23
Group by dept_name
Having Max(salary)>80000;

6.<>也可用于字符串

2.7.3.2 连接查询:

出现在from后面,表后面。

1.等值连接:

1
2
SELECT 
FROM Student JOIN SC ON Student.Sno = SC.Sno;

2.自然连接:

在等值连接的基础上,去掉重复的列。

关键字natural join.不需要加条件,自动根据名字匹配.

3.外连接与内连接:

left,right,inner.

2.7.3.3 嵌套查询:

代替表存在的地方,比如where后面。

1
2
3
4
5
6
SELECT Sname 
FROM Student
WHERE Sno IN
(SELECT Sno 内
FROM SC
WHERE Cno= ' 2 ');

子查询不建议、或无法使用ORDER BY子句。

带有exist的子查询:

1
SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT *FROM CourseWHERE NOT EXISTS(SELECT *FROM SCWHERE Sno=Student.SnoAND Cno=Course.Cno));

2.7.4 插入:

1
2
3
4
5
6
7
8
9
INSERT
INTO Student
VALUES (' 200215130'
,
'陈冬'
,
'男'
,18 ,
‘CS');

2.7.5 更新:

1
2
3
UPDATE Student
SET Sage=22
WHERE Sno=‘200215122

2.7.6 删除:

1
2
3
DELETE
FROM Student
WHERE Sno=‘200215121’;

3.数据库完全性与完整性:

3.1 安全性:

3.1.1 用户标识与鉴别:

image-20230608155849143

3.1.2 存取控制机制:

image-20230608155945282

3.1.3 授权与权限收回:

image-20230608160033484

1
2
把查询Course表的权限授给用户Bob
GRANT SELECT ON TABLE Course TO Bob;

image-20230608160128269

1
2
收回用户Bob修改Course表中课程号的权限
REVOKE UPDATE(Cno) ON TABLE Course FROM Bob;

数据库角色:

image-20230608160248592

image-20230608160254637

3.1.4 审计:

image-20230608160331131

3.1.5 数据加密:

image-20230608160353506

3.2 数据完整性:

3.2.1 域完整性:

image-20230608160459884

在create table时候定义.

3.2.2 实体完整性:

指关系的主码不能重复也不能取空值.

3.2.3 关系完整性:

主外键之间互相参照完整.

image-20230608160637100

3.2.4 断言:

image-20230608160728558

3.2.5 触发器:

触发器是用户定义在关系表上的一类由事件驱动的特殊过程

定义之后的触发器存储在数据库服务器中.

任何用户对表的增、删、改操作均由服务器自动激活相应的触发器.

不同RDBMS实现的触发器语法各不行同,互不兼容.

image-20230608160814723

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create trigger check2 after delete on Course

referencing old row as orow

for each row

when (orow.cno not in (select cno from Course)

and orow.cno in (select cno from SC))

begin

rollback

end;

4.数据库设计:

4.1 数据库设计步骤:

image-20230608161258687

4.2 概念数据库设计:

主要包括模式设计和事务设计。

模式设计以实体为主,产出ER图。

image-20230608161741986

er图举例子:

image-20230609075822365

4.3 逻辑数据库设计:

把概念数据库设计阶段产生的概念数据库模式,变换为逻辑数据库模式.

动态关系至少具有第三规范形式,静态关系至少具有第一规范形式;

转化格式为:

image-20230609075859713

加下划线的为数据库表的主键.

4.3.1 关系的转化:

一对一:

1.在一中增加另一个一的对应字段。

2.建立一个单独的关系表示(不推荐)

一对多:

1.在多中建立字段表征一.

2.单独建立表.

多对多:

建立中间表。

4.3.2 函数依赖:

可以通过属性x确定属性y,则称y依赖于x。

若y不是x的子集,则称为非平凡函数依赖。一般依赖均指非平凡函数依赖。

4.3.2.1 各种其他依赖:

image-20230608162748238

4.3.2.2 依赖求解:

1.求候选键:

首先进行分类。

对于给定的关系模式及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选键的成员。

对候选键的成员进行组合,如果某一组合的闭包:

image-20230609080512283

是全部列,那么这个组合为候选键。

image-20230609080601134

2.求最小覆盖:

让依赖看起来尽可能的简介,右侧只能有一个属性。

3.模式分解:

将一个1NF的关系分解为多个2NF的关系。

4.无损连接性:

image-20230609081216198

判断无损连接性的方法:

1.初始化一张图:

image-20230609081916100

上方是所有的属性,左侧是最后的划分。

a1到a5是一个元组,根据左侧划分填入表中。

2.填数:

根据依赖的顺序,找左侧数据,如果左侧行数据是a,则修改这些行所在的右侧列的值.

右侧有a则是a,右侧没有a则随便换一个b上去。

3.结束:

直到出现一行全是a的情况,出现则代表有无损连接性,不出现则没有无损连接性。

4.3.3 范式:

4.3.3.1 第一范式(1NF):

设R是一个关系模式。如果R的每个属性的值域都是不可分的简单数据项的集合,则称这个关系模式为第一范式关系模式,记作1NF。

4.3.3.2 第二范式(2NF):

若关系模式R是1NF,而且每一个非键属性都完全函数依赖于R的候选键(码),则R称为第二范式关系模式,记作2NF。

在满足1NF的前提下,表中不存在部分依赖,非主键列要完全依赖于主键。(主要是说在联合主键的情况下,非主键列不能只依赖于主键的一部分)。

举个例子:

image-20230608163330446

缺点
1·对于查询需要对多个表进行关联,导致性能降低
2·更难进行索引优化

4.3.3.3 第三范式(3NF):

不存在传递依赖。

image-20230608163435860

image-20230608163900922

设计范式的要求:

image-20230608163932353

4.4 物理数据库设计:

image-20230608164012741

5. 物理存储结构:

5.1 物理存储设备:

image-20230608204100360

5.2 磁盘:

image-20230608204139802

随机存取。

以扇区为单位。

磁盘读写是数据库应用的瓶颈,数据库的物理存储结构、数据库操作算法和查询优化的研究都把最小化磁盘读写次数作为重要目标之一。

5.2.1 缓冲处理:

image-20230608204309882

5.3 磁盘文件:

5.3.1 文件和关系:

image-20230608204427759

5.3.2 文件记录:

主要分为定长记录和边长记录:

image-20230608204528790

image-20230608204538995

5.3.3 无序与有序文件:

无序文件:查找效率低,增删效率高。

有序文件:查找效率高,插入效率低。

5.4 HASH文件:

用Hash函数来存储和存取关系记录。

image-20230608204843781

简单hash不再赘述。

动态hash:

image-20230608204916399

可拓展hash:

image-20230608204937612

线性hash:

image-20230608205002640

5.5 索引文件:

索引是一种数据结构,通常是有序文件。

image-20230608205049857

索引文件分类:

image-20230608205120548

5.5.1主索引:

索引域是主键。

5.5.2 聚集索引:

排序,一一对应。

image-20230608205330501

5.5.3 辅助索引:

建立在键值之上:

image-20230608205419798

5.5.4 b+树索引:

定义:

image-20230608205541287

举例:

特征:

image-20230608205627655

5.5.5 多维索引:

image-20230608205705602

6. 查询处理与优化:

6.1 关系代数操作算法:

算法运行环境:

M+1个缓冲区(输入和输出)+外存中存放的数据。

算法运行代价:

磁盘块存取数。

6.1.1 选择操作:

image-20230608205928006

image-20230608205935151

image-20230608205948344

6.1.2 投影操作:

image-20230608210120472

6.1.3 连接操作:

三种连接算法:

6.1.3.1.nest-loop-join:

循环暴力.

image-20230608210512866

6.1.3.2.sort-merge join:

排序之后匹配。

image-20230608210333645

6.1.3.3:hash-join:

分别哈希,对比哈希值。

image-20230608210408546

image-20230608210706403

6.1.3.4 计算连接代价:

image-20230609084259340

取代价最小的连接顺序。

6.1.4 集合操作:

image-20230608210801197

6.2 查询优化:

6.2.1 下推选择:

当查询中涉及视图时,某些情况下:

首先将选择操作尽可能往树的上部移动是很重要的。然后再把选择下推到所有可能的分枝。

6.2.2 启发式优化:

image-20230608211140851

6.2.3 操作代价的估计:

由逻辑计划可派生出多个不同物理计划。

image-20230608211222742

image-20230608211323662

连接条件的结果估计:

image-20230608211609026

6.2.4 选择连接顺序:

image-20230608211720410

6.2.5 物化与流水化:

image-20230608211814583

6.2.6 其他策略:

image-20230608212107861

小结:

image-20230608212151194

image-20230608212159546

7.事务处理与恢复:

7.1 事务:

是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

一个事务由一条或者多条SQL语句组成,一个程序中有一个或者多个事务。

事务是并发控制和恢复的基本单位。

7.2 定义:

image-20230608222227468

7.3 特性:

image-20230608222324166

image-20230608222339616

7.4 并发控制保证:

多个事务同时运行时,保证i.

事务在运行过程中被强行停止时,保证ad.

7.5 原理:

image-20230608222534196

7.6 事务执行方式:

在同一时刻并发运行大量事务时,有多种实现方式.

7.6.1 串行执行:

同一时刻只有一个事务在运行.

比较简单,但是不能充分的利用系统资源.

7.6.2 交叉并发:

交替执行事务.

image-20230608222801329

7.6.3 同时并发:

多个处理机同时运行多个事务.

是最理想的并发事务处理方式.

7.7 并发问题以及解决:

7.7.1 并发问题:

image-20230608222941882

image-20230608223016624

7.7.2 事务调度:

7.7.2.1 串行调度.

image-20230608223057400

是正确的,但是用串行执行一样,存在系统资源利用率不高的问题.

7.7.2.2 可串行化调度:

image-20230608223308532

7.7.2.3事务调度的表示方式:

r是读,w是写.

image-20230608223352663

7.7.2.4 冲突:

image-20230608223458648

image-20230608223515784

7.7.2.5 冲突可串行化:

image-20230608223557281

通过相邻动作的交换,将可串行化调度转换为串行调度.

7.7.2.6 优先图:

简单的判断一个调度是否是冲突可串行化的.

节点是事务.

如果调度中存在ti小于tj(按照先后顺序判断),则存在一条由i到j的弧.

简单的判断方法:

1.根据事务的a,b(操作的对象)进行分组

2.按照分组后的顺序,寻找r-w,w-r,w-w,如果找到后所对应的数字不同,则存在一条弧.

如果画完了有环,则是非冲突可串行化,就是有冲突,但是不能串行化的。

7.8 并发控制协议:

7.8.1 锁:

锁是数据库元素上的并发控制标志.

每个事务在存取一个数据库元素之前必须获得这个数据库元素上的锁.

一个事务需要获得的锁的类型依赖于它将在数据库元素上执行什么样的操作.

image-20230608225106550

7.8.2 两阶段锁协议:

image-20230608225149660

7.8.3 时间戳协议:

image-20230608225232710

8. 故障恢复:

8.1 数据库恢复:

image-20230608225328329

8.2 故障种类以及恢复:

8.2.1 介质故障:

image-20230608225436023

8.2.2 系统故障:

撤销或者重做.

image-20230608225515445

8.2.3 事务故障:

撤销事务,强行回滚.

8.3 数据库恢复:

恢复整个数据库文件.

8.3.1 基于日志的恢复:

image-20230608225712126

image-20230608225725435

8.3.1.1 日志缓冲技术:

image-20230608225810128

image-20230608225820534

8.3.1.2 更新技术:

推迟更新:

在一个事务所有更新操作对应的日志记录写入

永久存储器之前,该事务不能提交.

事务在不能提交之前,不能提交数据库.

恢复时;

从后往前开始扫描日志,建立两个事务表

提交事务表:已经提交的,且磁盘上有日志记录<COMMIT T>的所有事务

未提交事务表:那些具有< START T>日志记录,但无对应 < COMMIT T>的所有事务

image-20230608230133195

及时更新:

事务直接提交数据库。

日志恢复:

undo就是回滚.没提交的就回滚.

redo就是提交.以及提交了的就提交.

image-20230609084703655

8.3.1.3 检查点恢复:

image-20230608230326792

image-20230609084845349

1.从后到检查点.

2.从检查点到最后.

8.3.2 基于冗余存储的恢复:

主从复制.

image-20230608230415065