《数据库系统》期末复习笔记

期末复习的时候对课本进行了系统的整理,现在发上来希望能对大家有用www

正文

第1章 引言

  1. 数据库系统由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。这个数据的集合通常称作数据库。
  2. DBMS的主要特性
    1) 数据访问的高效和可扩展性
    2) 缩短应用开发时间
    3) 数据独立性(物理数据独立性/逻辑数据独立性)
    4) 数据完整性和安全性
    5) 并发访问和鲁棒性(故障恢复)
  3. 数据抽象
    a) 物理层:最低层次的抽象,描述数据实际上是怎样存储的
    b) 逻辑层:描述数据库中存储什么数据及这些数据间存在什么关系。这样逻辑层就通过少量相对简单的结构描述了整个数据库。虽然逻辑层的简单结构的实现可能涉及复杂的物理层结构,但逻辑层的用户不必知道这样的复杂性。这称作物理数据独立性
    c) 视图层:只描述整个数据库的某个部分。应用程序能够隐藏数据类型的详细信息。视图也可以出于安全目的隐藏数据信息。
  4. 实例和模式:特定时刻存储在数据库中的信息的集合称作数据库的一个实例。而数据库的总体设计称作数据库模式。
    物理模式在物理层描述数据库的设计,逻辑模式:在逻辑层描述数据库的设计。
    数据独立性:修改一层的结构定义不影响更高层的结构定义
    物理数据独立性:修改物理结构而不需要改变逻辑结构。应用程序不依赖于物理模式,独立于数据的结构和存储。
    逻辑数据独立性:数据逻辑结构的改变不影响应用程序(难以实现,因为应用程序严重依赖于数据的逻辑结构)
  5. 数据库结构的基础是数据模型。数据模型是一个描述数据、数据联系、数据语义以及一致性约束的概念工具的集合。数据抽象的不同层次需要不同的数据模型来描述。
  6. 数据库设计步骤:
    (1) 需求分析
    (2) 概念数据库设计
    (3) 逻辑数据库设计
    (4) 结构优化
    (5) 物理数据库设计
    (6) 创建并初始化数据库&安全设计
  7. 实体-联系数据模型使用一组称作实体的基本对象,以及这些对象间的联系。
  8. 事务管理:ACID:Atomicity (原子性), Consistence (一致性), Isolation (隔离性), Durability (持久性)
    并发控制管理器:控制并发事务之间的交互。
  9. 数据库系统的功能部件大致可分为存储管理器和查询处理部件
    存储管理器:在底层数据存储与应用程序及查询之间,提供接口
    查询处理器:接受数据库语言输入,经过解析、优化、执行,输出相应结果给用户。

第2章 关系模型介绍

2.1关系数据库的结构

关系数据库由表的集合构成,每个表有唯一的名字。表中的一行代表了一组值之间的一种联系。关系指代表,元组指代行,属性表示列。元组的每一个分量都是原子值。关系是笛卡尔积的子集。对每个属性都存在一个允许取值的集合成为该属性的域。如果域中元素被看做是不可再分的单元,则域是原子的。

关系和表的区别:a.在数学上,关系可以是无限的。b.表的属性没有次序,数学上关系列有序。

对关系进行限制:a.令关系元组数目有限 b.赋予关系的列属性名,取消属性之间的次序。 对关系进行限制后,关系=表。

关系的基本特征:行无序,列无序,行不同,列同质,不同列可出自同一域,分量的原子性。

空值的含义:表示值未知或不存在。

2.2 数据库模式

关系模式由属性序列及各个属性对应域组成。模式(大写)下可以定义关系变量(小写)。不同关系中的属性名可以相同。

2.3 码

  1. 超码(superkey)
    是一个或多个属性的集合,这些属性的集合能够唯一的表示一个关系中的一个元组。
    如果K是一个超码,那么K的任意超集也是超码。
    候选码(candidate key)
    任意真子集都不能成为超码的最小超码。
    主码(primary key)
    制定一个候选码作为关系的主码。应稳定、不易修改、切合主体。(加下划线)
    码是对关系模式的约束。确定原则:要按照现实世界语义约束定义、不能依据对数据的归纳总结定义。

  2. 外码(foreign key)
    一个关系模式(r1)可能它的属性中包含另一个关系模式(r2)的主码,这个属性在r1上称作参照r2的外码。关系r1称为外码依赖的参照关系,r2叫做外码的被参照关系。
    外码是关系模式的约束,要按照现实世界语义约束定义外码。参照关系和被参照关系可以是同一个表。
    参照完整性约束:要求在参照关系中任意元组在特定属性上的取值必然等于被参照关系中某个元组在特定属性上的取值。

2.4 模式图(schema diagram)

一个含有主码和外码依赖的数据库模式可以用模式图来表示。

第3章 SQL

3.1 SQL查询语言概览

DDL(数据定义语言)create/drop/alter
DML(数据操纵语言)select/delete/insert/update
DCL(数据控制语言)grant/revoke
事务管理语句:commit/rollback

3.2 SQL数据定义

基本类型
字符型:char(n),varchar(n)
数字类型:int,smallint,long,numeric(m,n),real,double,precision,float(n)
日期时间型:date,time,timestamp(datetime)
基本模式定义:
(1) create table
create table s
(sno char(2),
sname varchar(8) not null,
sage int ,
primary key(sno),
check(sage between 16 and 30)
);
Primary key(A,A,A)声明主码(实体完整性),必须非空且唯一
Foreign key(A,A,A) references r:声明外码(参照完整性)
Check(条件) 用户自定义完整性
Not null:非空约束
(2) alter table
为已有关系增加或删除属性
Alter table r add A D;所有元组在新属性上的取值为空
Alter table r drop A;
(3)drop table r;
不仅删除r的所有元组,还删除r的模式。无法恢复。
DDL 与事务无关,create/alter/drop不受commit/rollback的影响
(4)索引的创建
Create (unique) index s1 on s(sno);
Drop index s1;

3.3 SQL查询的基本结构

Select A1,A2,A3,…,An from r1,r2,…,rn where P
(1) select子句
由于每个元组的rowid不同,所以默认重复,除非使用distinct
Select distinct a1,a2 强行删除重复
Select all a1,a2 显示表明不去除重复
Select * 选择全部属性
允许±×/等算术表达式
(2)where子句
P为算术表达式
可以包含<,<=,=,>,>=,<>(比较运算符),and,not,or(逻辑连词),between(比较运算符)
Age (not) between 18 and 20
(3)from子句
相当于笛卡尔积,不是自然连接——natural join
Select name,course_id from instructor natural join teaches;
Join…using(属性) 由用户指明那些列相等
Select name,title from (instructor natural join teaches) join course using(course_id);

3.4 附加的基本运算

(1)更名运算
旧名 as 新名,属性和表均可以更名,as可以省略
表更名相当于声明了元组变量,没有更名的表可以看做是声明与表同名的元组变量。
(2)字符串操作
模式匹配操作like
Addr like ‘%济南%’
%:匹配任意子串
’intro%’匹配任何以intro打头的字符串,’%comp%’匹配任何包含comp的字符串
:匹配任意一个字符
__’匹配只含有三个字符的字符串
‘___%’匹配至少含三个字符的字符串
Upper(s)将字符串s转化为大写 lower(s)将字符串s转化为小写
Trim(s)去掉字符串后面的空格
\为转义字符,放在特殊字符前面使之成为普通字符
Like ‘ab%cd%’ 匹配以ab%cd开头的字符串
(3)排列元组的显示次序
Order by默认升序asc,desc为降序,多属性排序的处理:字典顺序。
只是显示次序排序,只能是sql的最后一个子句

3.5集合运算

(默认去重,使用all则强制按照多重集进行运算,保留重复)
·并运算 (select pid,sname from s) union (select pid,tname from t);
·交运算 intersect
·差运算 except

3.6 空值

空值为关系运算带来了特殊的问题。在算术运算中,任意输入为空则算术表达式的结果为空。比较运算中将涉及空值的结果视为unknown。布尔运算中,and:true and unknown = unknown, false and unknown = false, unknown and unknown = unknown;or:true or unknown = true, false or unknown = unknown, unknown or unknown = unknown;not:not unknown = unknown;
利用is null 对空值进行判断。为空返回true,否则返回false
聚集函数中的null:聚集函数的输入集合中忽略null,当作用于空集合时,count(∅)=0,其他均返回null;

3.7 聚集函数

平均值avg() 最小值min() 最大值max() 总和sum() 计数count()
默认作用于多重集,强制作用于集合使用distinct
无分组使用聚集函数则返回一个关系(有且只有一行),select子句中出现聚集函数,不能同时出现非聚集的属性。
分组聚集:group by 子句
在group by子句中的所有属性上的取值相同的元组将被分在一个组中。
需要保证:任何没有出现在group by中的属性如果出现在select子句中,只能出现在聚集函数内部。
Having 子句中的谓词在形成分组后才起作用,对分组进行检查.
任何出现在having子句中但是没有被聚集的属性必须出现在group by中。
顺序:from -> where -> group by -> having -> select -> order by

3.8 嵌套子查询

(1)in:∈
1.枚举集合 where cno in (‘c1’,’c2’,’c3’)
2.子查询,tuple in (select …) 测试元组是否是集合中的成员
求哪些学生没有学哪些课?
Select sno,cno
From s,c
Where (sno,cno) not in
(select sno,cno from sc);
(2) exists:
判断子查询元组的存在性,子查询中select什么内容并不重要,只要返回为真
求学了c1的学生
① select * from s
where sno in
(select sno from sc where cno=‘c1’);
② select * from s where exists
(select * from sc
where sc.sno=s.sno and cno=‘c1’);
③ select s.* from s,sc
where s.sno=sc.sno and cno=‘c1’;
求没有学c1的学生
① select * from s
where sno not in
(select sno from sc where cno=‘c1’);
②select * from s
where not exists
(select * from sc
where sno=s.sno and cno=‘c1’);
(3) 全部概念的处理
1.超集superset:B是A的子集
– not exists (B except A)
求学了全部课程的学生
select sno from s
where not exists
((select cno from c)
except
(select cno from sc
where sc.sno=s.sno))
2.关系代数:÷
– not in(not in)
select sno from s
where sno not in//减去没有学全部课的
(select sno
from s,c
where (sno,cno) not in
(select sno,cno from sc))
3.关系演算: 任意
– not exists(not exists)
select sno from s
where not exists
(select * from c
where not exists
(select * from sc
where sc.sno=s.sno
and sc.cno=c.cno))
(4) 集合比较
Some( r ) 关系中的某一个元组
至少比某一个大 >some
=some等价于in
<>some不等价于not in
All® 关系中所有的元组
大于all 比所有的都大
<>all 等价于not in
=all 不等价于 in
(5) 重复元组unique
Unique判定是否有重复元组,不能判定是否只有一个元组,返回bool值
求各门课程成绩均不相同的学生
select * from s
where unique
(select score
from sc
where sc.sno=s.sno)
(6) with子句
提供定义临时关系的方法,这个定义只对包含with子句的查询有效
With max_budget(value) as
(select max(budget) from department)
Select budget
From department,max_budget
Where department.budget=max_budget.value;
(7) from子句中添加子查询
把查询的结果关系用在from子句中,

Select …
from (select …
from …
where …
group …
having …)
as r(A1,A2…)
where …
group by …
having …

3.9 数据库的修改

(1)删除 delete from r where P
此处的from只能作用于一个关系,但是子句中的嵌套语句可以使用多个
(2)插入 insert into r values(v1,v2,v3);
(3)更新 update r set x=x where P;
Update r set (A1,A2,…)=(select …) where p;

第四章 中级SQL

4.1 连接表达式

连接类型:inner\left outer\right outer\full outer
连接条件:natural\using(使用同名属性)\θ连接(on)等价于where
任意组合
1.on条件
Select * from student join takes on student.ID=takes.ID
但是id属性会出现两次,利用投影所需属性来只显示一次
2.外连接——通过在结果中创建包含空值元组的形式,保留在连接中丢失的元组
·左外连接(left outer join) 只保留出现在左外连接运算之前的关系中的元组
·右外连接(right outer join)只保留出现在右外连接运算之后的关系中的元组
·全外连接(full outer join)保留出现在两个关系中的元组
Inner join为不保留未匹配元组的连接运算。

4.2 视图

Create view vname(a1,a2,…) as
Select …

  1. 视图不是逻辑模型的一部分,但是作为婿关系对用户可见的关系是视图。
  2. 视图和with相比:视图存储在DB数据字典中宏,是数据库模式的一部分;with定义的派生关系,仅在所属sql有效,不属于DB模式
  3. 视图和表相比:视图和表都是关系,都可以在sql直接应用。Db存储表的模式定义和数据,但只存储视图的定义,不存视图的数据。视图数据在使用视图时临时计算,物化视图是提高计算的一种手段。
  4. 视图的作用:对外模式的支持,安全性、方便性。
  5. 视图可更新的条件:
    ·from子句中只有一个数据库关系
    ·select子句中只包含关系的属性名,不包含任何表达式、聚集、distinct操作
    ·任何没有出现在select子句中的属性可以取空值;即这些属性上没有not null约束,也不构成主码的一部分。
    ·查询中不含有group by或having语句。
  6. 视图更新后的数据可能不符合视图的where子句,可以使用with check option来拒绝不满足视图的where子句的插入操作。
  7. 视图不可以递归定义

4.3 事务

事务对DDL语句无作用,主要用于DML语句。
Commit work/rollback work
一个事务或者在完成所有步骤后提交其行为,或者在不能成功完成其所有动作的情况下回滚其所有动作,通过这种方式体现事务具有原子性。

4.4 完整性约束

1.DBMS保证数据库数据满足完整性约束,拒绝破坏完整性约束的数据修改要求
2.分类:实体完整性——主码非空、唯一,定义了主码系统自动保证
参照完整性——外码,系统自动保证参照完整性
用户自定义完整性——根据语义约束,用户自定义:not null,unique,check ,assertion
3.not null——非空约束,指定的属性上不允许出现空值
任何试图导致某非空属性为空的操作都将被拒绝
4.unique(A1,A2,…)——不允许有两个元组在指定的属性组上取值相同
Unique本身不限定属性非空
5.check P
关系上的每一个元组,都必须满足P,可以针对一个或多个属性。
6.foreign key外码约束
一个关系模式(r1)可能它的属性中包含另一个关系模式(r2)的主码,这个属性在r1上称作参照r2的外码。关系r1称为外码依赖的参照关系,r2叫做外码的被参照关系。
参照完整性约束:

  1. 外码值与被参照关系中某元组主码的值相同
  2. 外码为空
  3. 定义 foreign key (dno) references depe(dno)
    对参照关系的insert和update需要进行参照完整性检查
    对被参照关系delete和update需要进行检查
    对被参照关系进行delete操作,参照关系中有元组外码等于要删除元组主码值时:
    三种处理方式:①拒绝删除(默认)②级联删除③外码置空
    对被参照关系进行update操作,参照关系中有元组外码等于oldvalue时:
    三种处理方式:①拒绝修改(默认)②级联修改③外码置空
    7.断言assertion
    定义在数据库上的约束,不是关系模式的定义元素
    Create assertion check§

4.6 授权

1.权限的授予和收回
Select, update, delete, insert 针对关系或属性的权限。没有关于元组的权限
Grant
On <关系名>
To <用户/角色列表> (with grant option)令其拥有转授权
Revoke
On <关系名>
To <用户/角色列表>
转授权人的权利被收回时,其转授的权利随之被收回。
2. 角色
每个数据库用户被授予一组他有权扮演的角色。权限可以授予给角色,给人授予权限
Create/drop role rolename
Grant/revoke role to/from user ;
数据库系统的身份标识分为用户user和角色role
用户和角色的关系:
·连接使用数据库,必须以一个特定的用户身份
·不能使用role身份直接连接使用数据库
·一个用户可同时具备多个角色
·一个角色可以为多个用户拥有
·角色可以拥有角色
·角色拥有关系可以传递
·权限可以授予用户或者角色
·用户拥有授给本用户的所有权利,以及本用户具有的角色的所有权利
4.5 SQL的数据类型和模式
1.字符、数字、日期时间型
日期类型的运算
Cast ‘2001-01-31 10:29:30.52’ as timestamp//将字符串转化为时间类型
Extract (year from Vdatetime)//从date或time值中提取单独的域
Date1-date2= //两日期之间间隔的天数
2.用户自定义类型
独特类型:create type Dollars as numeric(12,2)
结构化数据类型:create type person(pid char(18),name varchar(8));
可以drop type和alter type
用户自定义域:create domain Dollars as numeric(12,2) not null;//可以声明完整性约束。
Type是强类型,domain不进行强类型检查,支持强制类型转换。
3.创建索引 create index xx on r(S);
4.大对象类型
字符类型的大对象数据类型clob,二进制数据的大对象数据类型blob。
存储实现方式为指针+文件
Select Bolb doc into 变量(将指针赋给变量)
From book
Where cno=’c1’;
数据库的doc中存的是指针
5.模式、目录和环境
一个DBMS可以管理多个catalog/instance/database
一个instance可以含多个schema
一个schema含多个关系table/view
访问数据库必须使用连接,catalog.schema.rname
每个用户可以拥有自己的schema前提是有权限。

第六章 形式化关系查询语言

6.1 关系代数

6.1.1 基本运算 σΠ∪-×ρ
  1. σ 选择 (等同于SQL中的where)
    右下角为条件,括号内为关系σθ(E),行操作,只涉及一个关系。
    允许在选择谓词中进行比较,=、<>、<,<=,>,>=,和,且,非
  2. Π 投影(SQL中的select)
    选择属性,即列操作,自动去重。下标有序,可以利用投影改变列的顺序。
  3. ∪并
    二元关系运算,自动去重。并的两个关系必须相容:关系r和s必须是同元的,即他们的属性数目必须相同。对应列同域。但是不要求对应列同名。
  4. -差运算
    r-s表示所有在r而不在s中的元组的关系。同样要求相容。
    投影和并可以分配,投影和差不可分配。
    Πpid,name(S∪T)≡Πpid,name(S) ∪ Πpid,name(T)
    Πpid,name(S-T)≠Πpid,name(S) - Πpid,name(T)
  5. ×广义笛卡尔积
    用于关系的连接,重名属性要加关系限定,注意运算顺序以提高效率(使更少的元素做×)
  6. ρ更名
    给关系表达式和属性命名
    ρχ(E) 返回表达式E的结果,并把名字x赋予了他
    ρχ(a1,a2,…)(E) 返回表达式E的结果,并赋给名字x,同时将各属性进行更名。
    例题:
    求最高工资——将纵向比较改为横向比较
    非最高工资:Πinstructor.salary(σinstructor.salary<d.salary(instructor×ρd(instructor))
    再用Πsalary(instructor)减去非最高工资即为最高工资。
6.1.2 形式化定义

基本表达式:一个关系或一个常数关系
如果E1,E2是关系代数表达式,则其有限次基本运算也为表达式。

6.1.3 附加的关系代数运算
  1. ∩交运算
    r∩s=r-(r-s)
  2. 自然连接
    完成三个功能:笛卡尔积,同名属性等值运算,去掉一个同名属性
    若两关系无聪明属性,则r自然连接s=r×s
    自然连接可结合,可交换
    Theta连接是自然连接的拓展,可以把一个选择运算和一个笛卡尔积运算合并为单独的theta连接。r Theta连接 s=σθ(r×s)
    3.←赋值运算
    将右侧的表达式的结果赋值给左侧的临时关系变量
    r ⋈ s 写作:
    temp1 ← r x s
    temp2 ← r.A1=s.A1 ^ r.A2=s.A2… r.An=s.An (temp1)
    result = R × S (temp2)
  3. 外连接运算
    外连接是连接运算的扩展,可以处理缺失的信息。
    左外连接 右外连接 全连接
  4. 除运算
    R÷s求包含所有s的r中的元组
    在这里插入图片描述
    求选了所有课的同学
6.1.4 扩展的关系代数运算

1.广义投影
通过允许在投影列表中使用算数运算和字符串函数等来对投影进行扩展。
如salary/2
2.聚集
右下角注明聚集函数和属性
在这里插入图片描述
在前面声明分组属性 分组的属性也会被投影
在这里插入图片描述
右下角同时也可以进行更名
在这里插入图片描述
一个关系中只有一个元素的话,SQL可将之看做单值属性,但是关系运算则不可
在这里插入图片描述

6.2 元组关系演算

形式化定义:
原子公式
·s∈R:s是关系R中的一个元组
·s[x] θ u[y]:S[x]与u[y]为元组分量,它们之间满足比较关系
·s[x]θ c:分量s[x]与常量c之间满足比较关系
公式的递归定义
·原子公式是公式
·如果P是公式,那么┑P和§也是公式
·如果P1 , P2是公式,则P1∧P2 , P1∨P2 , P1=>P2也是公式
·如果P(t)是包含自由元组变量t的公式,且r是关系,则存在t∈r (P(t))和任意t∈r (P(t)) 也是公式
在这里插入图片描述
{t | P(t) } 所有使P谓词为真的元组t的集合,t[A]表示元组t在属性A上的值。t∈r表示元组t在关系r中

T只定义在ID属性上,因为这一属性是对t进行限制的条件所涉及的唯一属性,结果得到id上的关系。
笛卡尔积的表示:两个存在作and
在这里插入图片描述
有可能会产生无线关系的表达式是不安全的,引入P的域dom ( P )表示:
·显式出现在P中的值,以及在P中出现的关系中分量值的集合
·公式的域是指的集合,不强调值“同类型”
如果出现在表达式{t | P(t) }结果中所有值均来自dom§则称该表达式是安全的。
找出所有选了生物系全部课程的学生
在这里插入图片描述
他是所有满足如下条件的学生(即ID上的元组t)的集合:对关系course中所有的元组u,如果u在dept_name属性上的值是“biology”那么在关系take中一定存在一个包含该学生ID以及该课程course_id的元组
在这里插入图片描述

第7章 数据库设计和E-R模型

7.1 设计过程概览

数据库设计:概念模型设计、逻辑模型设计、物理模型设计
E-R图的位置:数据分析、描述的工具,用于概念模型设计
E-R图的作用:帮助澄清用户数据需求,分析员和用户对数据需求达成高度一致;数据逻辑模型设计的基础
E-R图的要求和评价标准:清晰、易懂,完整、精确、无二义

7.2 实体-联系模型

三要素:实体(矩形)、联系(菱形)、属性

实体(entity)是现实世界中可区别于所有其他对象的一个“事物”或“对象”。
实体集是相同类型即具有相同属性的一个实体集合。
实体集的外延指属于实体集的实体的实际集合。

联系(relationship)是指多个实体间的相互关联。
联系集是相同类型联系的集合。实体集参与联系集。实体在联系中所扮演的功能称为实体的角色。联系也可具有描述性属性。

属性——每个属性都有一个可取值的集合,称为域。
属性分类:简单和复合属性|单值和多值属性|派生属性

7.3 约束

三约束:映射基数约束、参与约束、码约束
7.3.1 映射基数约束
·一对一:A中的一个实体至多与B中的一个实体相关联,且B也同理
·一对多:A中的一个实体可以与B中的任意数目(0/多)实体相关联,B中的一个实体至多与A中的一个实体相关联
·多对一:A中的一个实体至多与B中的一个实体相关联,B中的一个实体可以与A中任意数目个实体相关联
·多对多:A中的一个实体可以与B中的任意数目(0/多)实体相关联,B也同理
7.3.2 参与约束
如果实体集E中每个实体都参与到联系集R的至少一个联系中,实体集E在联系集R中的参与成为全部的。如果E中只有部分实体参与到R的联系中,实体集E 到联系集R的参与成为部分约束。
7.3.3 码约束
实体的属性的值必须可以唯一表示该实体
参与联系的实体集的主码的组合作为联系集的超码。如果联系为多对一,则多段主码为该联系集主码。多对多则实体集主码共同作为联系集主码

7.5 E-R图

·分成两部分的矩形代表实体集。第一部分包含实体集的名字,第二部分包含实体集中属性名,主码加下划线。
·菱形代表联系集。
·未分割的矩形代表联系集的属性
·虚线将联系集属性连接到联系集。
·双线显示实体在联系集中的参与度
·双菱形代表连接到弱实体集的标志性联系集,同时弱实体集也要双矩形
映射基数:一端为箭头
完全参与:双横线
弱实体集——没有足够的属性以形成主码的实体集称为弱实体集,视为多值复合属性,但希望与其他实体、属性发生关系所以将其弱实体化。弱实体集存在依赖于标识实体集,之间的联系称为标识性联系,从弱实体集到标识实体集是多对一的,且弱实体集在联系中的参与是全部的。
在这里插入图片描述
使用弱实体集的原因:
·避免数据冗余,强实体集码重复,以及因此带来的数据的不一致性
·弱实体集反映了一个实体对其他实体依赖的逻辑结构
·弱实体集可以随它们的强实体集的删除而自动删除
·弱实体集可以物理地随它们的强实体集存储

7.6 转换为关系模式

弱实体集所对应的关系的码由弱实体集本身的分辨符再加上所依赖的强实体集的码,建外码约束
联系集向关系模式的转换:联系集的描述性属性加上参与R的实体集的主码。
=模式的合并
联系集和完全参与的一端进行合并,避免空值的产生
如果都不为完全参与,那么和参与的多的进行合并

第8章 关系数据库设计

8.2 原子域和第一范式

·1NF:如果关系模式R的所有属性的域都是原子的。
·原子域:该域的元素被认为是不可分的单元。
在这里插入图片描述

8.3 使用函数依赖进行分解

用基于码和函数依赖的规范方法判断一个关系模式是否应该分解。
·超码:令r( R )是一个关系模式。R的子集K是r( R )超码的条件:在r( R )的任意合法实例中,对于r的实例中的所有元组t1和t2总满足,若t1 ≠ t2,则t1[K] ≠ t2[K]。(全部与部分)
·函数依赖:表达唯一标识某些属性的值的约束
给定r( R )的一个实例,满足函数依赖α→β的条件:
·对实例中的所有元组对t1 和t2,若t1[α] = t2 [α] ,则t1[β] = t2[β]。(部分与部分)
·如果r®的每个合法实例都满足函数依赖α→β,则该函数依赖在模式r( R )上成立(hold)
如果函数依赖K->R在r( R )上成立,则K是r( R )的一个超码。
R下的所有函数依赖组成R的函数依赖集,记为F。F+标识F 集合的闭包,能够从给定F集合推导出的所有函数依赖的集合。
平凡函数依赖:A->A;Y⊆X,则 X→Y

BCNF
对F+中所有形如α→β的函数依赖,下面至少有一项成立:
·α→β是平凡的
·α是模式R的一个超码
分解非BCNF模式的一般规则:
存在至少一个非平凡的函数依赖α→β,其中α不是R的超码。在设计中用以下两个模式取代R:(α∪β) (使α变超码)和(R - (β -α ))(α、β无交集则β-α=β)
到BCNF的分解会妨碍对某些函数依赖的高效检查。BCNF不保持依赖

3NF
约束放宽,允许左侧不是超码的某些非平凡函数依赖。3NF保持依赖
具有函数依赖集F的关系模式R,对F+中所有型如α→β的函数依赖(其中α R且β R),下面至少有一项成立:
·α→β 是平凡的函数依赖(即β 含于 α)
·α是模式R的一个超码。
·β-α中的每个属性A都包含于R的一个候选码中。(属性A可以包含于不同的候选码中)

8.4 函数依赖理论

函数依赖集的闭包
F的闭包是被F逻辑蕴含的所有函数依赖的集合,记作F+
反复使用Armstrong公理即可得到F+
在这里插入图片描述
在这里插入图片描述
F+算法
在这里插入图片描述
函数依赖集的等价
定义 设R=(U)的两个函数依赖集F和G,如果F+=G+,则称F和G是等价的,如果F和G是等价的,则称F覆盖G且G覆盖F。
F和G是否等价的方法
检查F中的每个函数依赖X→Y,检查Y是否属于X+G。
检查G中的每个函数依赖X→Y,检查Y是否属于X+F。
属性集的闭包
令α为一个属性集。我们将函数依赖集F下被α函数确定的所有属性的集合称为F下α的闭包,即为α+。
把判断X→Y是否属于F+,转化为判断Y是否属于X+F 。
在这里插入图片描述
属性集闭包的用途:
在这里插入图片描述
候选码的求法
·一个属性集函数确定U,若它的任一个子集都不能函数确定U,则属性集可作为候选码。
·候选码从箭头左边的属性中找。仅在箭头左边的属性一定在候选码中。
在这里插入图片描述
正则覆盖
无关属性的定义:去除函数依赖中的一个属性不改变该函数依赖集的闭包称该属性为无关属性。即F+=F’+
在这里插入图片描述
左无关属性的判定:
令γ=α-{A},检查γ →β是否可由F推出,即γF+是否包含β
右无关属性的判定:
检验α→A是否能由F’推出,即==(α)F’+是否包含A==
正则覆盖
定义:关系模式R(F),F的正则覆盖记为Fc, F逻辑蕴含Fc中的所有依赖,且Fc逻辑蕴含F中的所有依赖。此外,Fc必须具有下列性质:
·Fc不含无关属性
·Fc函数依赖左端都是唯一的
在这里插入图片描述
Step1:左端相同的函数依赖合并;
Step2:逐个属性判断是否为无关属性;
Step3:发现无关属性,去掉该属性,并重新进行step2;直到没有无关属性;
无损分解
在这里插入图片描述
无损分解定理
关系模式R( C ), {R1,R2}是R( C )的分解,当下面两个函数依赖至少有一个在R( C )上成立时,分解是无损分解:
R1∩R2→R1
R1∩R2→R2
自然连接后可能会多出许多元组,则为有损分解。
保持依赖
R的分解中,不依靠不同关系的连接就能验证R上成立的所有函数依赖,称分解保持依赖。
关系模式R(F), {R1,R2…Rn}是R的一个分解;F+中所有只包含Ri中属性的函数依赖的集合Fi,称为F在Ri上的限定。Fi必须是F+中只含Ri属性的函数依赖集合。
关系模式R(F),{R1,R2…Rn}是R的一个分解,Fi是F在Ri上的限定,F’= F1∪F2∪…∪Fn:如果F’+=F+, 即F’F,则称分解是保持依赖的分解
算法一:分别计算F’+和F+,若F’+=F+则保持依赖
算法二:验证每一个f∈F,是否在某一个RI上成立
如果都成立:保持依赖 (充分条件);如果不都成立:不知道是否保持依赖
算法三: 如果result包含β中所有属性,则 α→β∈F被保持;该分解保持依赖当且仅当F中所有的函数依赖都保持。
在这里插入图片描述

8.5 分解算法

BCNF的判定
计算α→β中α的闭包,是否包含R中所有属性
在这里插入图片描述
3NF判定
按照3NF定义逐个检查F中是否有违背3NF要求的函数依赖
分解算法
·Step1:计算Fc
·Step2:对每一α→βFc ,构造关系(αβ)
·Step3:如果step2构造的所有模式都不含R的码,选择R的一个候选码α,构造关系(α)
step2-3构造出的所有模式集合是R的3NF分解
得到无损的保持依赖的分解

8.6 使用多值依赖的分解

多值依赖定义:关系模式r( R ), α属于 R且β 属于 R ,γ=R-α-β;
如果对任意r属于R均有下述命题成立:
任意 t1,t2属于 r,如果t1[α]=t2[α],则必存在t3,t4,使
t3[α]=t4 [α]= t1 [α] =t2[α],
t3[β]=t1[β],t3[γ]=t2[γ]
t4[β]=t2[β],t4[γ]=t1[γ]
则称: α多值决定β,
β多值依赖于α
多值依赖α→→β在R上成立
或者定义为:关系模式R, α,β  R,γ=R-α-β;如果给定一个α值,有一组β值与之对应,β取值与γ无关,则称α→→β。
在这里插入图片描述
平凡的多值依赖:β∪α=R,或者β属于α,必有α→→β
若α→β ,则α→→β,每一个函数依赖也是一个多值依赖。
若α→→β, 则α→→R – α –β
依赖的闭包:D逻辑蕴含的所有函数依赖和多值依赖的集合,称作D的闭包,记作D+

4NF
对D+中所有型如α→→β的多值依赖(α R且βR) ,至少一下之一成立:
1) α→→β是一个平凡的多值依赖,即:βα或 α∪β=R
2) α是R的一个超码
则称关系模式R为4NF,记作R∈4NF

第12章 事务管理

12.1 事务概念

1.构成单一逻辑工作单元的操作集合称作事务。
2.事务是访问并可能更新各种数据项的一个程序执行单元。
3.四大特性ACID
·原子性(atomicity)事务的所有操作在数据库中要么全部正确反映出来,要么完全不反映。
·一致性(consistency)隔离执行事务即没有其他事务并发执行的情况下,保持数据库的一致性。
·隔离性(isolation)尽管多个事务可能并发执行,但是每个事务都感觉不到系统中有其他事务在并发的执行。
·持久性(durability)一个事务成功完成后,他对数据库的改变必须是永久的,即使出现系统故障。
4.并发性:同时处理多个任务,但某一时刻只做一个,处理统一数据并发会有冲突,但是并发不会堵塞,提升总体吞吐量
并行性:每个时刻都是多个任务一起执行。
5.事务运用read(X)和write(X)访问数据

12.2 事务原子性和持久性

事务必须处于一下状态之一:
·活动的(active):初始状态,事务执行时处于这个状态
·部分提交的:最后一条语句执行后
·失败的:发现正常的执行不能继续后
·中止的:事务回滚并且数据库已恢复到事务开始执行前的状态后
·提交的:成功完成后

12.3 事务隔离性

1.并发的优点:提高吞吐量和资源利用率;减少等待时间
2.事务的执行顺序称为调度,表示指令在系统中执行的时间顺序。一组事务的一个调度必须包含这一组事务的全部指令,并且必须保持指令在各个事务中出现的顺序。
3.串行调度一定为对的。
4.等价于某一串行调度的并发执行才是正确的

12.4 可串行化

并发执行等价于串行调度为可串行化。

  1. 如果调度S可以经过一系列非冲突指令交换转换成S’,我们称S’与S是冲突等价的。调度S是冲突可串行化的。
  2. 当I和J是不同事务在相同数据项上的操作,并且其中至少有一个是write指令时,我们说I和J是冲突的。
  3. 设I与J是调度S的两条连续指令。若I与J是属于不同事务的指令且不冲突,则可以交换I与J的顺序得到一个新的调度S’,S与S’等价。
  4. 优先图:Ti,Tj冲突,若Ti先访问,则Ti优先于Tj,在图中加一条边。
    若图中没有环,则为冲突可串行化,可以通过交换得到串行调度,且串行顺序为图中的拓扑顺序。
    12.5 可恢复性
  5. 可恢复调度应该满足:对于每对事务Ti和Tj,如果Ti读取了之前由Ti所写的数据项,则Ti应先于Tj提交。
  6. 因单个事物故障导致一系列事物回滚的现象称为级联回滚。
    无级联调度应满足:对于每对事务Ti和Tj,如果Tj读取了先前由Ti所写的数据项,则Ti必须在Tj这一读操作前提交。
    每一个无级联调度都是可恢复调度。
    12.6 并发控制
    12.6.1基于锁的协议
    1.锁:
    共享锁:如果事务Ti获得了数据项Q 上的共享锁(S),则Ti可读但不可写Q,其它共享锁也可读。
    排它锁:如果事务Ti获得了数据项Q上的排它锁(X),则Ti可读写Q,其他事务不可读写。
    Lock-S(Q)来申请Q上的共享锁,lock-X(Q)申请排它锁,unlock(Q)来释放锁
    一个具体的数据项可以同时有多个共享锁,此后的排它锁请求必须一直等待直到该数据项上的所有共享锁被释放。
    要访问一个数据项,事务Ti必须首先给该数据项加锁。如果该数据项已经被另一事务加上了不相容的若,则在所有其他事务持有的不相容类型锁被释放之前,并发控制管理器不会授予锁。Ti只好等待,知道所有其他事务持有的不相容类型锁被释放。
    不能过早释放锁。
    每个事务都在等待其他事务释放锁的无法正常执行状态称为死锁。当死锁发生时,系统必须回滚一个事务。
    封锁协议规定事务何时对数据项们进行加锁、解锁。
  7. 锁的授予
    饿死:T1欲申请排他锁,但是一直有共享锁,且不断加入新的共享锁。T1总是不能在该数据项上加排它锁,T1饿死。
    当事务Ti申请对数据项Q加M型锁时,a.不存在数据项Q上持有与M型锁冲突的锁的其他事务,b.不存在等待对数据项Q加锁且先于Ti申请加锁的事务。
    S X S S中x先执行,虽然s可以直接上锁,但是需要等待,防止X被饿死。
    ·两阶段封锁协议——保证可串行性
    每个事务分两个阶段提出加锁和解锁申请:
    ·增长阶段:事务可以获得锁,但不能释放锁。可进行s->x的锁转换upgrade
    ·缩减阶段:事务可以释放锁,但是不能获得新锁,可进行x->s的锁转换downgrade
    对任何事务,在调度中该事务获得其最后加锁的位置(增长阶段结束点)称为事务的封锁点。多个事务根据他们的封锁点排序,这个顺序就是一个事务的可串行化顺序。
    事务遵守两阶段封锁协议是可串行化调度是充分条件,不是必要。
    要求:一旦释放锁就不能申请新锁。
    不排除死锁和级联回滚的情况发生
    级联回滚可通过严格两阶段封锁协议避免,除了要求两阶段之外,还要求事务所持有的所有排它锁必须在事务结束后,方可释放。
    强两阶段封锁协议:事务提交之前不得释放任何锁。在此条件下,事务可以按其提交的顺序串行化。
    自动加锁、解锁机制:
    ·当事务Ti进行read(Q)操作时,系统就产生一条lock-S(Q)指令,该read(Q)指令紧跟其后。
    ·当事务Ti进行write(Q)操作时,系统检查Ti是否已在Q上持有共享锁。
    若有,则系统发出upgrade(Q)指令,后接write(Q)指令。
    否则系统发出lock-X(Q)指令,后接write(Q)指令。
    ·当一个事务提交或中止后,该事务持有的所有锁都被释放。

12.7 恢复系统——保证原子性和持久性

为保证原子性,必须在修改数据库之前,先向稳定存储器输出信息,描述要做的修改。
·日志是日志记录的序列,他记录数据库中的所有更新活动。
更新日志记录描述一次数据库写操作。<Ti,Xj,V1,V2>表明事务Ti对数据项Xj执行了一个写操作,v1为原数据,v2为新数据。写操作必须先添加日志记录,再操作数据库。
< Ti start > 事务Ti开始
< Ti commit> 事务Ti提交
< Ti abort> 事务Ti终止。
数据库修改指:事务执行了对磁盘缓冲区和磁盘的更新。
使用日志执行适当的undo和redo操作。Undo:将数据项设置为旧值,Redo将数据项设置为新值。
事务提交:

  1. 当一个事务的commit日志记录—这是该事务的最后一个日志记录—输出到稳定存储器后,我们就说这个事务提交了。但是不是在事务提交时必须将包含该事务修改数据项的快输出到稳定存储器中,可以在以后的某个时间再输出。同时未提交数据也可能被output至存储器,写入前必须先将日志缓冲区所有日志先写到磁盘上。

  2. 系统从尾端开始反向扫描日志来执行undo。

  3. 对于事务Ti的undo操作完成后,它写一个日志记录,表示撤销完成了

  4. 对于每个事务,undo只执行一次。

  5. 如果日志包括记录,但既不包括也不包括则对事务Ti进行撤销。如果既包含,以及或,则需要对Ti进行重做。

  6. 检查点
    检查点的执行过程
    a) 将当前位于主存的所有日志记录输出到稳定存储器
    b) 将所有修改的缓冲块输出到磁盘
    c) 将一个日志记录输出到稳定存储器,L是执行检查点时正活跃的事务列表。
    检查点执行过程中不允许事务执行任何更新动作。
    加入检查点记录提高系统恢复效率,崩溃后在日志中找到最后一条检查点记录,只需对L中的事务在检查点之后的记录进行undo或redo。

课后作业:

12.14 请解释为什么undo-list中事务的日志必须由后往前进行处理,而redo-list中事务的日志记录则必须由前往后进行处理。
在undo-list中的单个事务中,假设一个数据项被多次更新,比如从1更新到2,然后从2更新到3。如果按正向顺序处理撤消日志记录,则数据项的最终值将被错误地设置为2,而按反向顺序处理,则将该值设置为1。同样的逻辑也适用于撤消列表中由多个事务更新的数据项。使用与上面相同的示例,但是假设事务已提交,很容易看出,如果重做处理按正向顺序处理记录,则最终值将正确地设置为3,但如果按反向顺序处理,则最终值将错误地设置为2。
12.15 请解释检查点机制的目的。应该间隔多长时间做一次检查点?执行检查点的频率对一下各项有何影响?
·无故障发生时的系统性能如何?
·从系统崩溃中恢复所需的时间多长?
·从介质(磁盘)故障中恢复所需的时间多长?
检查点使用基于日志的恢复方案来完成,以减少崩溃后恢复所需的时间。如果没有检查点,则在崩溃后必须搜索整个日志,并且所有事务都要从日志中撤消/重做。如果已经执行了检查点,那么在恢复时可以忽略检查点之前的大多数日志记录。执行检查点的另一个原因是在稳定存储空间满时清除日志记录。
由于检查点在执行过程中会导致性能损失,所以如果快速恢复不是很重要,那么应该减少检查点的使用频率。如果我们需要快速恢复,检查点频率应该增加。如果可用的稳定存储数量较少,则频繁检查点不可避免的。
检查点对磁盘崩溃的恢复没有影响;归档转储相当于从磁盘崩溃中恢复的检查点。
12.16 列出ACID特性,解释每一特性的用途。
12.17 事务从开始执行直到提交或终止,期间要经过几个状态。列出所有可能出现的事务状态序列,解释每一种状态变迁出现的原因。
可能的状态序列为:
答:活跃→部分提交→提交。这是一个成功的事务将遵循的正常顺序。执行完所有语句后,它进入部分提交状态。将足够的恢复信息写入磁盘后,事务最终进入提交状态。
b.活动→部分提交→中止。在执行事务的最后一条语句后,它进入部分提交状态。但在将足够的恢复信息写入磁盘之前,可能会发生硬件故障,破坏内存内容。在这种情况下,它对数据库所做的更改被撤消,事务进入中止状态。
c.活动→失败→中止。事务启动后,如果在某个点发现正常执行无法继续(由于内部程序错误或外部错误),则进入失败状态。然后回滚,然后进入中止状态。
12.18 解释串行调度和可串行调度的区别
属于一个事务的所有指令一起出现的调度成为串行调度。
一个可串行调度等价于某个串行调度即可,调度等价有两种定义:冲突等价和视图等价。
SQL语句联系

  1. 找出001号课成绩不是全班最高分的所有学生的学号
    Select S# from SC
    Where C#=’001’
    and score<some(select score from SC where C#=’001’)
  2. 求有两门以上不及格课程同学的学号及其平均成绩
    Select S#,avg(score) from SC
    Where S# in
    (select S# from SC
    where score<60
    group by S#
    Having count(*)>2)
    Group by S#;
  3. 列出没学过李明老师讲授的任何一门课的所有学生的姓名
    Select sname from S
    Where not exists(select * from SC,T,C
    where T.tname=’李明’
    and SC.S#=S.S#
    and SC.C#=C.C#
    and C.T#=T.T#)
  4. 求没有选全部课程的学生学号?
    Select sno from s where sno not in
    (Select sno
    From sc
    Group by sno
    Having count()=(select count()from course))
    Employee(person_name,street,city)
    Works(person_name,company_name,salary)
    Company(company_name,city)
    Manages(person_name,manager_name)
  5. 找出比住在”Mambai”的所有员工的收入都高的那些员工
    {t | ∃ w1 ∈ works (t[person_ name] = w1[person_ name]
    ∧ ¬∃w2 ∈ works(w1[salary] < w2[salary] ∧
    ∃e2 ∈ employee (w2[person_ name] = e2[person_ name]
    ∧ e2[city] = ’Mumbai’)))}
  6. 找出居住地与工作的公司在同一城市的员工姓名
    Πperson_name (company∞works∞employee )
  7. 找出位于Small Bank Company所位于的每一个城市的公司
    company ÷Πcity(σcompany_name=“Small Bank Corporation”(company))
  8. 找出位于Small Bank Company所位于的每一个城市的公司(元组关系)
    {t| c∈company(t[company_name]=c[company_name]
    ∧ c2∈company(c2[company_name]=’Small Bank Corporation’
    c3∈company(c3[company_name]=t[company_name]
    ∧c3[city]=c2[city])))}
  9. 找出工资高于SBC的每一位员工的员工
    {t| w∈works(w[person_name]=t[person_name]∧
    w2∈works(w2[company_name]=’Small Bank Corporation’ w [salary]>w2[salary]))}
  10. 列出没有学生的学院的名称。
    ∏dname (D) - ∏dname (S ⋈ D)
  11. 查询学生人数最多的学院编号和学院名称。
    Select dno, dname
    From d
    Where dno in (select dno from s
    group by dno
    having count() >= all (select count() from s group by dno))
  12. 查询被所有学生都选修的课程编号和课程名称
    Select cno, ctitle
    From c
    Where not exists ( (select sno
    From s)
    Except
    (select sno
    From sc
    Where sc.cno=c.cno))
    或Select cno, ctitle
    From c
    Where cno in (select cno
    from sc
    group by cno
    having count() = (select count() from s))
  13. 查询选修课程包含王老师所授全部课程的学生学号
    Select Sno from SC where not exists
    ((select cno from c where teacher=’王老师’)
    Except
    (select cno from sc t where t.sno=sc.sno));
发布了6 篇原创文章 · 获赞 0 · 访问量 422

猜你喜欢

转载自blog.csdn.net/qq_43512550/article/details/104537987
今日推荐