关系数据库理论
先上图!!
规范化
函数依赖
设R(U)是一个属性集U上的关系模式,X和Y是U的子集(X,Y都是属性的集合)。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称 “X函数确定Y” 或 “Y函数依赖于X”,记作X→Y。
X 称为这个函数依赖的决定属性集。Y=f(x)
- 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
- 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立 - 数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在, 则拒绝装入该元组。
例: Student(Sno, Sname, Ssex, Sage, Sdept)
假设不允许重名,则有:
Sno → Ssex, Sno → Sage , Sno → Sdept,Sno ←→ Sname,
Sname → Ssex, Sname → Sage,Sname → Sdept
但Ssex -/->Sage
若X→Y,并且Y→X, 则记为X←→Y。
若Y不函数依赖于X, 则记为X-/->Y。
平凡函数依赖与非平凡函数依赖
在关系模式R(U)中,对于U的子集X和Y,
如果X→Y,但Y 不属于 X,则称X→Y是非平凡的函数依赖
若X→Y,但Y 属于 X, 则称X→Y是平凡的函数依赖
例:在关系SC(Sno, Cno, Grade)中,
非平凡函数依赖: (Sno, Cno) → Grade
平凡函数依赖: (Sno, Cno) → Sno
(Sno, Cno) → Cno
对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。
完全函数依赖与部分函数依赖
在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X ′ ,都有X′ -/-> Y, 则称Y完全函数依赖于X,记作
若X′ →Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X,记作
例:在关系SC(Sno, Cno, Grade)中
由于:Sno →Grade,Cno → Grade,
因此:(Sno, Cno) F→ Grade
在关系Student(Sno, Sdept, Mname, Cno, Grade)
由于: Sno → Sdept,Sno是(Sno, Cno)的真子集
因此: (Sno, Cno) P→ Sdept
传递函数依赖
在关系模式R(U)中, 如果X→Y, (Y 不属于X), Y-/->X ,Y→Z,则称Z 传递函数依赖于X,记为:X 传递→ Z
(注: 如果X→Y ,Y→X, 即X←→Y,则Z直接依赖于X)
例: 在关系Std(Sno, Sdept, Mname)中,有:
Sno → Sdept,Sdept → Mname,Sdept -/->Sno
Mname传递函数依赖于Sno
码
设K为R<U,F>中的属性或属性组合。若K U, 则K称为R的侯选码。可以做主码的属性集。
若候选码多于一个,则选定其中的一个做为主码(Primary Key)。
- 主属性:包含在任何一个候选码中的属性
- 非主属性:不包含在任何候选码中的属性
- 全码:所有属性共同构成主码
[例6.2]关系模式S(Sno, Sdept, Sage),单个属性Sno是码,
SC(Sno,Cno,Grade)中,(Sno,Cno)是码
[例6.3]关系模式R(P,W,A)
P:演奏者 W:作品 A:听众
一个演奏者可以演奏多个作品;
某一作品可被多个演奏者演奏;
听众可以欣赏不同演奏者的不同作品;码为(P,W,A),即All-Key
关系模式 R 中属性或属性组X 并非R 的码,但 X 是另一个关系模式的码,则称 X 是R 的外码(Foreign key)
- 如在SC(Sno,Cno,Grade)中,Sno在SC中不是码,但Sno是关系模式Student(Sno,Sdept,Sage)的码,则Sno是关系模式SC的外码
- 主码与外码一起提供了表示关系间联系的手段
范式
-
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
-
范式是符合某一种级别的关系模式的集合。
-
范式的种类:
第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
BC范式(BCNF)
第四范式(4NF)
第五范式(5NF)
范式之间也是存在关联性的,低级的范式包含高级的范式 -
某一关系模式R为第n范式,可简记为R∈nNF。
-
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化 。
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
- 关系中不存在多值列。
- 第一范式是对关系模式的最起码的要求。
- 满足第一范式的关系模式并不一定是一个好的关系模式。
满足第一范式的关系模式并不一定是一个好的关系模式
[例6.4]关系模式 S-L-C(Sno, Cno, Sdept, Sloc, Grade)
Sloc为学生住处,假设每个系的学生住在同一个楼。
若R∈1NF,且每一个非主属性完全函数依赖于R的码,则R∈2NF。
例:
- S-L-C(Sno, Cno, Sdept, Sloc, Grade) ∈ 1NF
- S-L-C(Sno, Cno, Sdept, Sloc, Grade) ∉ 2NF
一个关系模式R不属于2NF,就会产生问题。
(1)插入异常
(2)删除异常
(3)数据冗余度大
将1NF化为2NF的方法: - 消除非主属性对主码的部分依赖
- 就是将一个模式分解为多个模式,直至每个模式里面都不存在非主属性对主码的部分依赖
解决办法
把S-L-C分解为两个关系模式,消除这些部分函数依赖
(1) 在S-L关系中可以插入尚未选课的学生。
(2) 删除一个学生的所有选课记录,只是SC关系中没有关于该学生的记录了, S-L关系中关于该学生的记录不受影响。
(3) 不论一个学生选多少门课程,他的Sdept和Sloc值都只存储1次。
(4) 学生转系只需修改S-L关系中该学生元组的Sdept值和Sloc值。
2NF的问题
- 插入异常
如果某个系目前暂时没有在校学生,就无法把这个系的信息,如null, MA, S 存入数据库。 - 删除异常
如果某个系的学生全部毕业了,在删除该系学生信息的同时,把这个系的信息也丢掉了。 - 数据冗余
每一个系的学生都住在同一个地方,关于系的住处的信息却重复出现。 - 修改复杂
学校调整学生住处时,必须同时更新该系所有学生的Sloc属性值。
解决方法
- 消除非主属性对主码的传递依赖
- 将一个模式分解为多个模式,直至每个模式里面都不存在非主属性对主码的传递依赖
第三范式
关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z 不属于Y), 使得X→Y,Y→Z成立,Y -/-> X,则称R<U,F> ∈ 3NF。
例: S-L ( Sno, Sdept, Sloc) 不属于 3NF
S-D( Sno, Sdept) ∈ 3NF
D-L( Sdept, Sloc) ∈ 3NF
- 若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。
- 如果R∈3NF,则R也是2NF。
- 采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
- 将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余。
BCNF
关系模式R<U,F>∈1NF,若X→Y且Y X时 X必含有码,则R<U,F> ∈BCNF。
若R∈BCNF
- 每一个决定因素都包含码
- 所有非主属性对每一个码都是完全函数依赖
- 所有的主属性对每一个不包含它的码,也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性
R ∈BCNF 和 R ∈3NF是充分不必要关系
例6.8:在关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。
每一教师只教一门课。每门课由若干教师教,某一学生选定某门课,就确定了一个固定的教师。某个学生选修某个教师的课就确定了所选课的名称 : (S,J)→T,(S,T)→J,T→J
候选码:(S,J)和(S,T)
主属性: S、J、T
STJ∈3NF
- 没有任何非主属性对码传递依赖或部分依赖
STJ不属于BCNF
- T是决定因素,T不包含码
解决方法:将STJ分解为两个关系模式:
- SJ(S,J) ∈ BCNF, TJ(T,J)∈ BCNF
- 所有非主属性都完全函数依赖于每个候选码
- 所有主属性都完全函数依赖于每个不包含它的候选码
- 没有任何属性完全函数依赖于非码的任何一组属性
第三节 数据依赖的公理系统
逻辑蕴含
- 对于满足一组函数依赖F的关系模式R<U, F>,其任何一个关系r,若函数依赖X–>Y都成立,则称F逻辑蕴含X ——>Y
- 例:已知R(X,Y,Z),F={X→Y,Y→Z}, 则X→Z成立,X→Z被F逻辑蕴含。
Armstrong公理系统
- 一套推理规则,是模式分解算法的理论基础
- 用途:
从一组函数依赖求得蕴含的函数依赖
求给定关系模式的码
-
引理6.1 (由合并规则和分解规则可得)
-
闭包
在关系模式R<U, F>中为F所逻辑蕴含(或推导)的函数依赖的全体叫做F的闭包,记为F+ -
Armstrong公理系统是有效的、完备的
有效性:由F出发根据Armstrong公理导出的每一个函数依赖一定在F+中
完备性:F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理导出
设F为属性集U上的一组函数依赖,X ⊆U,XF+ ={ A|X→A能由F 根据Armstrong公理导出},XF+称为属性集X关于函数依赖集F 的闭包。
例:U={A, B, C, D}; F={A → B, BC → D};
AF+ = {A,B}
算法:求属性集X关于函数依赖集F的闭包XF+
重点哈!!!
前面所说的了解就行,直接做题理解更快!
看题:通俗的讲就是:求(AB)F+,你就直接令X0=AB,然后找能由AB决定的(箭头右边找)直接并上,就行,并着并着发现,欸!全了,就结束啦
利用属性组的闭包求关系的候选码
已知:R(X,Y,Z),F={X→Y,Y→Z},求关系的候选码。
过程:
- 首先,找出所有没有在任何一个函数依赖右侧出现的属性,把他们组成一个属性组K,候选码一定含有K;
- 计算KF+ ,如果KF+ =U,则K为候选码,而且只有这一个;
- 否则,基于K扩充属性,形成新的属性组(含有K但不含候选码的所有可能的属性组合),计算新属性组的闭包,判断其是否为候选码。
Key: {X}
- 已知关系模式 R<U,F>,其中
U={A,B,C,D,E};
F={AB→C,B→D,C→E,EC→B,AC→B}。
求关系的候选码和范式级别。
没有在右侧出现的属性:A
A的闭包:A 不是U,扩充:
AB的闭包:A,B,C,D,EU
AC的闭包:A,C,B,E,DU
AD的闭包:A,D !=U
AE的闭包:A,E !=U
AB作为候选码,满足1NF
AC作为候选码,满足1NF
先确定候选码,再判断范式级别!!!
- 已知关系模式 U={A,B,C,D,E,F,G}
F={A->B, A->C, A->D, D->E, (A, F)-> G} ,求候选码。
没有在右侧出现的属性:A,F
A的闭包:ABCDE,不是U,需扩充
F的闭包:F,不是U,需要扩充
AF的闭包:AFBCDEG,候选码AF
满足1NF