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