第四章-关系数据理论
1.关系规范化理论
设计性能较优的关系模式称为规范化,规范化主要的理论依据是关系规范化理论;根据这个理论,关系数据库中的关系必须满足: 其每一个属性都是不可分解的;
关系数据库规范化是为了解决关系数据库中,插入、删除和数据冗余问题而引入的;
规范化的基本思想是逐步消除数据依赖中不合适的部分,使关系数据库模式的各关系模式达到某种程度的“分离”,即“one fact in one place(一事一地)”的模式设计原则。
让一个关系只描述一个实体或者实体间的一种联系。若多于一个实体(包括概念、联系),就把它“分离”出来。因此,所谓规范化,实质上是概念的单一化,即一个关系表示一个实体。
关系规范化中的删除操作异常是指不该删除的数据被删除,插入操作异常是指应该插入的数据未被插入;
规范化的过程可概括如下:
graph TB
A((1NF))-->|消除非主属性对码的部分函数依赖|B((2NF))
B-->|消除非主属性对码的传递函数依赖|C((3NF))
C-->|消除主属性对码的部分和传递函数依赖|D((BCNF))
D-->|消除非平凡且非函数依赖的多值依赖|F((4NF))
F-->|消除不是由候选码所蕴含的连接依赖|G((5NF))
规范化过程,是通过投影分解运算,把低一级范式的关系模式“分离”为若干个高一级范式的关系模式。但这种投影分解不是唯一的,要求分解“既保持函数依赖”,又具有“无损连接性”。
2.超键、候选键、主键
| 键 | 描述 |
|---|---|
| 超键(super key) | 在关系中能唯一标识元组的属性集称为关系模式的超键; |
| 候选键(candidate key) | 不含有多余属性的超键称为候选键;任何一个候选键中的属性称作主属性; |
| 主键(primary key) | 用户选作元组标识的一个候选键作为主键; |
| 主属性 | 简单来说,主属性是候选码属性的并集 |
举例说明,现有学生表如下:
| 学号 | 姓名 | 性别 | 身份证号 |
|---|---|---|---|
| 1 | 小王 | 男 | 344 |
| 2 | 小吴 | 女 | 354 |
| 3 | 小丽 | 女 | 364 |
| 4 | 小张 | 男 | 374 |
已知: 学号和身份证号这两个属性都能唯一标识元组,则
该学生表的超键为: {学号},{身份证号},{学号,姓名},{学号,姓名,性别}... ...
该学生表的候选键为: {学号} , {身份证号};
该学生表的主键为: {学号} || {身份证号};
因为主键的选择是人为的,所以选候选键中的任意一个都行;一般选{学号};
该学生表的主属性为: {学号} U {身份证号};
关系模式的候选关键字可以有1个或多个,而主关键字(或叫主码,主键)仅有1个;
3.函数依赖
The value of one or a group attributes can decide the value of other attributes.
所谓函数依赖其实质是刻画关系中各个属性之间相互制约而又相互依赖的关系。通俗地理解: 某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。
如上述学生表,一个学生的学号能决定学生的姓名,也可称姓名属性依赖于学号,对于现实来说,就是如果知道一个学生的学号,就一定能知道学生的姓名,这种情况就是姓名依赖于学号,这就是函数依赖,函数依赖又分为非平凡依赖,平凡依赖;从性质上还可以分为完全函数依赖、部分函数依赖和传递函数依赖。
graph TD
数据依赖-->多值依赖
数据依赖-->连接依赖
数据依赖-->函数依赖
函数依赖-->完全函数依赖
函数依赖-->部分函数依赖
函数依赖-->传递函数依赖
完全函数依赖
通过{学生学号, 选修课程名}可以得到{该生本门选修课程的成绩},而通过单独的{学生学号}或者单独的{选修课程名}都无法得到该成绩,则说明{该生本门选修课程的成绩}完全依赖于{学生学号,选修课程名}。
部分依赖
通过{学生学号,课程号}可以得到{该生姓名},而通过单独的{学生学号}已经能够得到{该生姓名},则说明{该生姓名}部分依赖于{学生学号,课程号}; 又比如, 通过{学生学号,课程号}可以得到{课程名称},而通过单独的{课程号}已经能够得到{课程名称},则说明{课程名称}部分依赖于{学生学号,课程号}。(部分依赖会造成数据冗余及各种异常。)
传递依赖
在关系R(学号,宿舍,费用)中,通过{学号}可以得到{宿舍},通过{宿舍}可以得到{费用},而反之都不成立,则存在传递依赖{学号}->{费用}。(传递依赖也会造成数据冗余及各种异常。)
平凡函数依赖和非平凡函数依赖
平凡函数依赖:如果Y依赖于X,同时Y是X的子集,那么称X -> Y 为平凡函数依赖;
非平凡函数依赖:Y不是X的子集。
对于任意关系模式而言,平凡函数依赖是必然成立的,其并不反映新的语义特征,因此我们一般不讨论平凡函数依赖。
4.1NF、2NF、3NF和BNCF
1NF-第一范式
关系模式R的所有属性都是不可再分的基本数据项
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 所谓第一范式(1NF)是指数据库表的每一列(即每个属性)都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。简而言之,第一范式就是无重复的列。
举例1:
| 学号 | 课程号 |
|---|---|
| S01 | {C1,C2,C3} |
| S02 | {C1,C4} |
它就不满足1NF,因为{C1,C2,C3}和{C1,C4}是集合。
修改为符合1NF:
| 学号 | 课程号 |
|---|---|
| S01 | C1 |
| S01 | C2 |
| S01 | C3 |
| S02 | C1 |
| S02 | C4 |
2NF-第二范式
在满足第一范式为前提下,消除部分依赖
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主关键字或主键或主码。
第二范式要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性依赖于主关键字。
举例2:
| 学生编号 | 学生姓名 | 班级编号 | 院系 | 课程编号 | 成绩 |
|---|---|---|---|---|---|
| S01 | 杨明 | D01 | 思齐 | C01 | 90 |
| S02 | 李婉 | D01 | 思齐 | C01 | 87 |
| S01 | 杨明 | D01 | 思齐 | C02 | 92 |
| S03 | 刘海 | D02 | 述圣 | C01 | 95 |
| S04 | 安然 | D02 | 述圣 | C02 | 78 |
| S05 | 乐天 | D03 | 省身 | C01 | 82 |
对于学生姓名、班级编号、院系,这三个属性可以直接通过学生编号来确定,在这里课程编号显得很多余。也就是,学生姓名、班级编号、院系对{学生编号,课程编号}存在部分函数依赖。把Student表进行拆分,可以消除部分依赖。
学生表如下:
| 学生编号 | 学生姓名 | 班级编号 | 院系 |
|---|---|---|---|
| S01 | 杨明 | D01 | 思齐 |
| S02 | 李婉 | D01 | 思齐 |
| S01 | 杨明 | D01 | 思齐 |
| S03 | 刘海 | D02 | 述圣 |
| S04 | 安然 | D02 | 述圣 |
| S05 | 乐天 | D03 | 省身 |
课程表如下:
| 学生编号 | 课程编号 | 成绩 |
|---|---|---|
| S01 | C01 | 90 |
| S02 | C01 | 87 |
| S01 | C02 | 92 |
| S03 | C01 | 95 |
| S04 | C02 | 78 |
| S05 | C01 | 82 |
3NF-第三范式
在满足第二范式的前提下,消除传递依赖
满足第三范式(3NF)必须先满足第二范式(2NF)。在满足第二范式的基础上,且不存在传递函数依赖,那么就是第三范式。简而言之,第三范式就是属性不依赖于其它非主属性。
举例3:
根据上面对传递依赖的分析,对于Student表,学生编号可以唯一确定他所在的院系,但是注意到这中间存在传递过程,即学生编号唯一确定该学生所对应的班级编号,班级编号对应唯一的院系。我们称,院系对学生编号传递函数依赖。
把Student表继续进行拆分,可以消除传递依赖。
学生表如下:
| 学生编号 | 学生姓名 | 班级编号 |
|---|---|---|
| S01 | 杨明 | D01 |
| S02 | 李婉 | D01 |
| S01 | 杨明 | D01 |
| S03 | 刘海 | D02 |
| S04 | 安然 | D02 |
| S05 | 乐天 | D03 |
班级-院系表如下:
| 班级编号 | 院系 |
|---|---|
| D01 | 思齐 |
| D02 | 述圣 |
| D03 | 省身 |
- 一般说来,数据库只需满足第三范式(3NF)就行了。
BNCF
属于BCNF的关系模式的是在函数依赖范畴内,已消除了插入和删除的异常
4NF-第四范式
5NF-第五范式
范式的判断
graph LR
A[求候选键]-->B{非主属性是否部分依赖于候选键}
B-->|Yes|C((1NF))
B-->|No|D{非主属性是否传递依赖于候选键}
D-->|Yes|E((2NF))
D-->|No|F{所有依赖项左边是否全为候选键}
F-->|No|G((3NF))
F-->|Yes|H((BCNF))
5.无损连接性
如果对分解后的新关系进行自然连接⋈得到的元组的集合与原关系完全一致,则称为无损连接(lossless join)
如果将从一个关系模式中投影分解出来的两个或多个关系模式经过自然连接⋈能够恢复到原先的关系模式,则称这种投影分解具有无损连接性。
比如将举例3分解出来的学生表与班级-院系表进行自然连接⋈,在保持原有的函数依赖关系下,产生的新关系模式与原关系模式一致,即保持了无损连接性。
6.假设关系模式R(A,B)属于3NF
R∈3NF,仍可能存在插入、删除异常,这时需要向更高一级范式BCNF转换.R∈ 3NF,则R必属于2NF,不一定属于BCNF.
7.在关系DB中,任何二元关系模式的最高范式必定是BCNF。
8.在关系模式R中,若其函数依赖集中所有的候选关键字都是决定因素,则R的最高范式是3NF
如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式(3NF)的模式。这样R中每一个非主属性完全函数依赖于R的某个候选键且每个非主属性都不传递依赖于R的候选键,这就保证了函数依赖集中所有候选关键字都是关系中的决定因素。
9.当B属性函数依赖于A属性时,属性A与B 的联系是 多对一
B函数依赖于A,也可以说成A函数确定B。即A->B,即每个A一旦确定,随之而言B就确定。我们可以简单理解成Y=X^2,每有一个X确定,Y就确定。Y=2 ==> X = ±√2但一个Y却可以有多个X与之对应。即一个确定的B可以有多个A,但是一个确定的A只能有一个B。即多对1;
引申
- 如果两属性集X,Y之间是1:1联系,则存在函数依赖:X ←→ Y(Function: Y=X);
- 如果两属性集X,Y之间是1:M联系,则存在函数依赖:X → Y(Function: Y=X^2);
- 如果两属性集X,Y之间是M:M联系,则不存在函数依赖;
10.关系模式R中的属性全部是主属性,则R的最高范式至少是3NF
一个全部是主属性的关系必然不会有非主属性部分或者传递依赖的问题,故至少是3NF。但此关系无法保证每一个非平凡的多值依赖或者函数依赖都包含码,所以R的最高范式至少是 3NF。
12.最小依赖集
定义
如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,称为最小依赖集或最小覆盖:
(1) F中任一函数依赖的右部仅有一个属性;
(2) F中不存在这样的函数依赖X→A,使得F与F-{F→A}等价;
(3) F中不存在这样的函数依赖X→A,X有真子集Z使得F-{F→A} U {Z→A}与F等价;
方法
(1) 将函数依赖集拆解为右边仅含有属性;
(2) 分别求闭包关系;
例题: 求最小依赖集
设有关系模式,其中: ,求F的最小依赖集。
解:
① ;
② 分别遮住属性那项依赖看是否不可缺
- ,遮住后发现只能推出E,该项依赖不可缺;
- ,遮住后发现只能推出G,该项依赖不可缺;
- ,遮住后发现可以推出,该项依赖可以省略且不用于下次项依赖的判断;
- ,遮住后发现只能推出F,该项依赖不可缺;
- ,遮住后发现可以推出,该项依赖可以省略且不用于下次项依赖的判断;
- ,遮住后发现只能推出H,该项依赖不可缺;
- ,遮住后发现可以推出,该项依赖是冗余项,可以省略。
最小依赖集为: 。
13.3NF及BCNF范式分解步骤
3NF范式分解步骤
- 求最小依赖集;
- 求出关系模式R的所有的候选关键字;
- 每个依赖项为一个关系,若模式集中每个关系都没有包含候选关键字,则任选一个候选关键字作为关系添加进关系模式集ρ中;即最小依赖集U候选关键字;
- 若所得结果中存在包含关系,应当简化;
BCNF范式分解步骤
- 求最小依赖集;
- 求出关系模式R的所有的候选关键字;
- 任意选R中一项依赖作为,则是,依次类推,直至最后的为候选关键字;
- 取依赖项组合的关系组成新的关系模式集ρ;
举例1:
设有关系模式,,,将R分解为3NF模式集及BCNF模式集;
解:
① 分析得函数依赖集F已经为最小依赖集;
② 求出该关系模式R的候选关键字为;
③ 3NF模式集;
④ BCNF模式集;
graph TB
A(R=ABCDEF)-->B((R1=AEF))
A-->C(R2=ABCDE)
C-->D((R3=AB))
C-->E(R4=ACDE)
E-->F((R5=CDA))
E-->G((R6=CDE))
举例2:
- 对于DC→A ,DC有相同的行是a3,a4的行,A列中相应的行b31, b41 改为b31 这句话是错的,应改为A列中相应的行b31, b41改为a1。
- D列最终应该全为a4,答案有误
某列具有两个或两个以上相同的元素时,推出的对应列的ai才有效。口诀: 遇b改为a,遇a则不变。
举例3:
已知R<U,F>,U={A,B,C,D,E},F={AB→C,C→D,D→E},R的一个分解ρ={R1(A,B,C),R2(C,D),R3(D,E)},判断ρ是否为无损连接?
解:
- 构造初始二维表
| --- | A | B | C | D | E |
|---|---|---|---|---|---|
| R1 | a1 | a2 | a3 | ||
| R2 | a3 | a4 | |||
| R3 | a4 | a5 |
- 判定后的二维表
| --- | A | B | C | D | E |
|---|---|---|---|---|---|
| R1 | a1 | a2 | a3 | a4 | a5 |
| R2 | a3 | a4 | a5 | ||
| R3 | a4 | a5 |
所以该分解为无损连接。
14.无损连接分解判定
15.证明题
(1) 证明: 3NF一定是2NF
(2) 证明:BCNF一定是3NF
BCNF一定是3NF
证明:采用反证法.
设R不是3NF.
则必然存在如下条件的函数依赖
X→Y(Y→/X),Y→Z
其中X是键属性,Y是任意属性组,Z是非主属性
Z属于Y,这样Y→Z函数依赖的决定因素Y不包含候选键,
与BCNF范式的定义相矛盾,
所以如果R属于BCNF,则R也是3NF.
3NF一定是2NF
有一道和这道题比较类似,符号实在不好打
给你一条定理的证明看一下你就懂了:
若关系模式R(U,F)∈3NF,则R∈2NF
证明:
假设R中非主属性A部分依赖于关键字K
则存在K'是K的子集,使得F|=K'→A.
因K'是K的子集有K→K',但K'→/K.
于是有K→K',K'→/K,K'→A
并A不属于K,
因而A传递以来于K,即R不属于3NF,与已知矛盾.
希望你能看懂→/.就是不能推导出.真累