hello大家好,上次学习了逻辑数据库设计上半部分(点击复习ER模型转换为关系数据库模式与函数依赖),今天我们来学习下半部分:关系模式的范式与分解。教妹学数据库,没见过这么酷炫的标题吧?“语不惊人死不休”,没错,标题就是这么酷炫。
我的妹妹小埋18岁,校园中女神一般的存在,成绩优异体育万能,个性温柔正直善良。然而,只有我知道,众人眼中光芒万丈的小埋,在过去是一个披着仓鼠斗篷,满地打滚,除了吃就是睡和玩的超级宅女。而这一切的转变,是从那一天晚上开始的。
从此之后,小埋经常让我帮她辅导功课。上次她听了逻辑数据库设计的上半部分,这次便央求我讲下半部分。本篇教程通过我与小埋的对话的方式来谈一谈逻辑数据库设计。
![](https://img-blog.csdnimg.cn/20200320101611907.png)
博客还在持续更新中,想看同系列的其他博客。欢迎访问我的专栏《教妹学数据库系统》希望大家能够关注我,一起学数据库系统。
关系模式的范式
关系模式R(U)的函数依赖集F的最小覆盖(canonicalcover)是满足下列3个条件的F
的等价函数依赖集Fc
-
(不存在冗余函数依赖) Fc中不存在函数依赖X→Y,使得Fc与Fc−{X→Y}等价
-
(函数依赖左部不存在冗余属性) Fc中不存在函数依赖X→Y,有Z⊂X使得Fc与(Fc−{X→Y})∪{Z→Y}等价
-
(函数依赖左部唯一) Fc中任意两个函数依赖的左部不相同
第一范式(1NF)
如果关系模式R的每个属性都是不可分的,则称R为第一范式关系模式,记作R∈1NF
- 问题1: 数据插入异常。现象:该插入的数据无法插入
- 问题2: 数据删除异常。现象:不该删除的数据不得不删除
- 问题3: 数据修改繁琐。现象:数据修改非常繁琐,容易出错
- 问题4: 数据冗余。现象:存在大量冗余数据
主属性:候选键中的属性
存在问题
问题1(数据插入异常): 该插入的数据无法插入
问题2(数据删除异常): 不该删除的数据不得不删除
问题3(数据修改繁琐): 数据修改繁琐,容易出错
问题4(数据冗余): 存在大量冗余数据
解决方法
-
产生原因:非主属性Sdept和Sdean部分函数依赖于候选键(Sno,Cno)
-
解决方法:把SDC分解为下面两个关系模式:
- SD(Sno,Sname,Sdept,Sdean)
- SC(Sno,Cno,Grade)
第二范式(2NF)
- 如果关系模式R∈1NF,且R的每个非主属性都完全函数依赖于R的候选键,则称R为第二范式关系模式,记作R∈2NF。
存在问题
问题1(数据插入异常): 该插入的数据无法插入
问题2(数据删除异常): 不该删除的数据不得不删除
问题3(数据修改繁琐): 数据修改繁琐,容易出错
问题4(数据冗余): 存在大量冗余数据
解决方法
-
产生原因:非主属性Sdean传递函数依赖于候选键Sno
-
解决方法:把SD分解为下面两个关系模式:IS(Sno,Sname,Sdept)、ID(Sdept,Sdean)
第三范式(3NF)
如果关系模式R∈2NF,且R的每个非主属性都不传递函数依赖于R的候选键,则称R为第三范式关系模式,记作R∈3NF
存在问题
在STC(Sno, Tno, Cno)中没有非主属性(候选键(Sno, Tno)和(Sno, Cno))
在一个关系中,如果一个属性是构成某一个候选关键字(候选键)的属性集中的一个属性,则称它为主属性。
-
问题1(数据插入异常): 该插入的数据无法插入
-
问题2(数据删除异常): 不该删除的数据不得不删除
-
问题3(数据修改繁琐): 数据修改繁琐,容易出错
-
问题4(数据冗余): 存在大量冗余数据
解决方法
-
产生原因: 主属性Cno部分函数依赖于候选键(Sno,Tno)
-
解决方法: 把STC分解为下面两个关系模式: TC(Tno,Cno)、ST(Sno,Tno)
Boyce-Codd范式(BCNF)
-
若关系模式R(U,F)∈1NF,且F的最小覆盖中每个函数依赖X→Y的左部X都是R的候选键,则称R为BC范式关系模式,记作R∈BCNF
-
若关系模式R(U,F)∈3NF,且R的任意主属性都直接完全函数依赖于R的候选键,则称R为BC范式关系模式,记作R∈BCNF
范式之间的关系
关系模式分解
设R(U)是属性集U上的关系模式,ρ={R1(U1),R2(U2),…,Rn(Un)}是R的一个分解(decomposition),如果U=U1∪U2∪···∪Un,且对任意i不等于j,有Ui 不包含于 Uj(无冗余)
关系模式分解准则1: 无损连接性(LosslessJoin)
关系模式分解准则2: 函数依赖保持性
函数依赖集的投影
设R(U,F)是关系模式,U是属性集,F是函数依赖集。对于V⊆U,F在V上的投影是F+中满足X∪Y⊆V的函数依赖X→Y的集合。
保持函数依赖分解
设R(U,F)是一个关系模式,U是属性集,F是函数依赖集。设ρ={R1(U1),R2(U2),…,Rn(Un)}是对R的一个分解,Fi是F在Ui上的投影。如果F1∪F2∪···∪Fn覆盖F,则ρ是保持函数依赖的模式分解。
无损连接性的判定
-
目的:判定一个关系模式分解是否满足无损连接性
-
方法1:(一个关系模式被分解为两个关系模式时的判定方法)
-
定理:关系模式R(U,F)的分解ρ={R1(U1), R2(U2)}满足无损连接性的充要条件是F|=U1∩U2→U1或F|=U1∩U2→U2
函数依赖保持性的判定
-
目的: 判定一个关系模式分解是否满足函数依赖保持性
-
方法1: 根据函数依赖保持性的定义进行判断
-
方法2: 对于函数依赖集F中每个函数依赖X→Y,使用下面的算法判断是否F1∪F2∪···∪Fn|=X→Y
关系模式的分解方法
3NF关系模式分解算法
功能: 将关系模式R(U,F)分解为一组3NF关系模式,且该分解既保持函数依赖,又满足无损连接性
BCNF关系模式分解算法
功能:将关系模式R(U,F)分解为一组无损连接BCNF关系模式
总结
咱们玩归玩,闹归闹,别拿学习开玩笑。
关系范式中第一范式、第二范式、第三范式、BCNF范式是根据完全函数依赖和传递函数依赖层层递进的(如果不清楚函数依赖的关系,可以回过头来看上半部分)。
值得注意的是,规范是评价关系模式的标准之一。是否每个关系模式都有必要化成第三范式或BCNF范式,欢迎在留言交流!