MySQL-关系规范化
几个概念:
有集合{a,b,c,d,e}
码
\textcolor{purple}{码}
码:能确定整个集合(元组)的所有组合(属性列)。 比如{a},{a,b,c},{a,c,d}等等都可以确定整个集合,尽 管有的存在冗余,但是它们都是码。
候
选
码
\textcolor{purple}{候选码}
候选码:含有属性最少的能确定整个集合的小集合。例如如果{a,b}能确定整个集合,但{a},{b}都不能单独确定整个集合,那么{a,b}就是一个候选码。
候
选
码
的
真
子
集
中
不
存
在
码
\textcolor{red}{候选码的真子集中不存在码}
候选码的真子集中不存在码。
主
码
\textcolor{purple}{主码}
主码:是任意一个候选码,可以人为选定。
外
码
\textcolor{purple}{外码}
外码:如果{a,b,c}不是{a,b,c,d,e}的码,但是另一个集合{a,b,c,d,e,f}的码,那{a,b,c}就是{a,b,c,d,e}的一个外码。
主
属
性
\textcolor{purple}{主属性}
主属性:候选码所有属性的并集
非
主
属
性
\textcolor{purple}{非主属性}
非主属性:不包含在任何码里的属性,例如每个能确定集合{a,b,c,d,e}的小集合里面都没有e,那e就是非主属性。
范式
关系型数据库中,数据表设计的基本原则
函数依赖:完全、部分、传递
1.第一范式
原子的,一个格里就一个数据
2.第二范式
满足条件:
(1)满足第一范式
(2)必有主键,且
非
主
属
性
必
须
完
全
函
数
依
赖
于
主
键
(
候
选
键
)
\textcolor{red}{非主属性必须完全函数依赖于主键(候选键)}
非主属性必须完全函数依赖于主键(候选键)
球员编号 | 比赛编号 | 姓名 | 年龄 | 比赛时间 | 比赛场地 |
---|
… | … | … | … | … | … |
(球员编号, 比赛编号) → (姓名, 年龄, 比赛时间, 比赛场地)
(球员编号) → (姓名,年龄)
姓
名
、
年
龄
部
分
依
赖
于
主
键
,
不
满
足
第
二
范
式
\textcolor{red}{姓名、年龄部分依赖于主键,不满足第二范式}
姓名、年龄部分依赖于主键,不满足第二范式
所以要改进为第二范式,分成三张表:
此时每张表都符合第二范式
3.第三范式
满足条件
(1)满足第一范式,且每一个非主属性既不
部
分
\textcolor{red}{部分}
部分依赖于码,也不
传
递
\textcolor{red}{传递}
传递依赖于码。
(2)满足第二范式,且每一个非主属性不
传
递
\textcolor{red}{传递}
传递依赖于码
存在传递依赖,所以不满足第三范式
如果分成两张表:
此时满足第三范式
4.巴斯范式
满足条件:
(1)满足第三范式
(2)主属性既不
部
分
\textcolor{red}{部分}
部分依赖也不
传
递
\textcolor{red}{传递}
传递依赖于候选键
学生ID | 专业 | 导师 | 专业GPA |
---|
1 | AI | Tom | … |
2 | 大数据 | Landa | |
1 | 大数据 | Landa | |
3 | 大数据 | Judy | |
已知其中学生ID和专业是主键
显然满足第三范式,但是主属性专业依赖于导师,{学生ID,导师}也是一个候选键,所以主属性部分依赖于候选键,不符合巴斯范式。
如果分成两张表:
此时满足巴斯范式
逻辑蕴含
对于关系R(U,F),X—>Y不在F中,但X—>Y可以由F导出,则F逻辑蕴含X—>Y。
举例:
ArmStrong公理系统
例:
属性集闭包
X关于函数依赖集F的闭包:
(1)X⊆U,例如U={A,B,C,D},X可以是{A},{A,D}等等。
(2)F是一堆函数依赖的集合,例如A—>B,A—>D等等。
(3)
X
F
+
=
A
∣
X
—
>
A
可
以
由
F
根
据
A
r
m
S
t
r
o
n
g
公
理
系
统
推
出
X^+_F={A|X—>A可以由F根据ArmStrong公理系统推出}
XF+=A∣X—>A可以由F根据ArmStrong公理系统推出
举个例子:
求
属
性
集
闭
包
:
\textcolor{red}{求属性集闭包:}
求属性集闭包:
码值理论
属性分四类:
(1)L类:只出现在F中依赖关系左边的属性,如:X—>Y ,只出现在X处的属性。
(2)R类:只出现在F中依赖关系右边的属性,如:X—>Y ,只出现在Y处的属性。
(3)N类:F中依赖关系左右两边都没出现的属性。
(4)LR类:F中依赖关系左右两边都出现的属性。
定理1:如果属性是L或者N类,那它
一
定
\textcolor{red}{一定}
一定是R的候选码的成员,如果是R类,
必
不
\textcolor{red}{必不}
必不在任何候选码中,如果是LR类,
可
能
\textcolor{red}{可能}
可能是R候选码的成员。
定理2:如果X(X∈R)是L类和N类属性的并集,且
包含R的全部属性,那么X就是R的唯一候选码。
候选关键字求解算法:
举例:
函数依赖集的等价与覆盖
1.等价:
2.依赖集:
例题:
3.最小依赖集:
也叫最小覆盖
F是最小依赖集要满足条件:
(1)右单一属性:F中的函数依赖,右边只能有一个属性
(2)无冗余: 如果F中有这样一个依赖:X—>A,当F刨去X—>A时,发现与原F等价,则不满足最小依赖。
(3)决定因素不冗余:如果F中有这样一个依赖:X—>A,X有个真子集Z,当F刨去X—>A,又加上Z—>A时,发现还与原F等价,则不满足最小依赖。
例:
很显然F是最小依赖,但是F’不是,F‘去掉(SNO,SDEPT)—>SDEPT之后,还能跟原F’等价。
求
最
小
依
赖
集
(
F
m
)
的
算
法
\textcolor{red}{求最小依赖集(Fm)的算法}
求最小依赖集(Fm)的算法
例题:
例1
例2:
模式分解
概念:
1.无损连接性
判断方法(以题举例):
第一步:建表T
| A | B | C | D | E | F |
---|
ABC | a1 | a2 | a3 | b14 | b15 | b16 |
CD | b21 | b22 | a3 | a4 | b25 | b26 |
DEF | b31 | b32 | b33 | a4 | a5 | a6 |
第二步:逐个考察函数依赖,修改表

| A | B | C | D | E | F |
---|
ABC | a1 | a2 | a3 |
a
4
\textcolor{red}{a4}
a4 |
a
5
\textcolor{red}{a5}
a5 |
a
6
\textcolor{red}{a6}
a6 |
CD | b21 | b22 | a3 | a4 |
a
5
\textcolor{red}{a5}
a5 |
a
6
\textcolor{red}{a6}
a6 |
DEF | b31 | b32 | b33 | a4 | a5 | a6 |
第三步:观察新表,若其中有一行已变成a1,a2,a3…ak,则满足无损连接性
2.独立投影法则
判断无损连接性的一种方法,但是条件是R
只
被
分
解
为
两
个
关
系
模
式
\textcolor{red}{只被分解为两个关系模式}
只被分解为两个关系模式。
例题:
3.函数依赖保持性
若R(U,F)的一个分解
的所有函数依赖的并集(F1UF2UF3U…UFk)逻辑蕴含了函数F中的所有函数依赖,则其具有函数依赖保持性。
例:
4.模式分解算法
一个模式分解必须满足以下条件:
(1)无损连接性
(2)依赖保持性
(3)某一范式
分解算法1:
转换为3NF的保持函数依赖的分解(考虑范式和函数依赖保持性,忽略无损连接性)
步骤:
(1)求F的最小依赖集,记为G
(2)找出不在G中出现的属性,把这些属性构成一个关系模式,把这些属性从U中去掉,剩余的属性记为W
(3)若G中存在这样一个依赖关系X—>A,XA=W,
={R},R={X,A},算法中止
(4)否则,把每一个X—>A变成Ri={X,A},
={R1,R2,…Rk},算法结束
例:
分解算法2:
结果为3NF,且具有依赖保持和连接不失真的分解
步骤:
(1)算一遍分解算法1,求出各个分组(R1,R2…)
(2)求原F的候选码KEY,依据码值定理
(3)如果求出的候选码KEY包含在由分解算法1求出的各函数依赖关系中,舍弃,否则并进来
例:
例:
主码,候选码等之间关系的图片引用自https://blog.csdn.net/sumaliqinghua/article/details/85872446