模式分解
模式S-C-M (S 学号,C 班级,M 班主任)
该模式设计不好,存在数据冗余、插入异常、删除异常和更新异常
p1 = {S-C(学号,班级),C-M(班级,班主任)}
p2 = {S-C(学号,班级),C-M(学号,班主任)}
p3 = {S-C(学号,班主任),C-M(班级,班主任)}
规范化理论:
- 检测是否在一个表中聚集了过多的属性的过程
- 模式分解来消除违反范式规则而带来的影响(插入、更新、删除异常,冗余大),构造合适的(更好的)数据模式
- 概念建模过程中规范化用于检验却总是很有帮助
数据依赖
- 一个关系内部属性与属性之间的一种约束关系(属性值时候相同)
- 现实世界属性间相互联系的抽象
- 数据内在性质
- 语义的体现
函数依赖FD
Sno | Sname | Ssex | Sage |
---|---|---|---|
a value | b1 value | c value | d value |
a2 value | b2 value | c2 value | d2 value |
… | … | … | … |
an value | bn value | cn value | dn value |
定义: 设 R(U) 是一个属性集 U 上的关系模式, X 和 Y 是 U 的子集。若对于 R(U) 的任意一个可能的关系 r , r 中不可能存在两个元组在 X 上的属性值相等, 而在 Y 上的属性值不等, 则称“ X 函数确定 Y ”或“ Y 函数依赖于 X ”,记作 X → Y
若 Y 不函数依赖于 X ,则记作 X ↛ YFor example:
Sno → Ssex, Sno → Sage
假设不允许重名 Sno ←→ Sname
- 非平凡函数依赖
X → Y ,但 Y ⊈ X 则称 X → Y 为非平凡函数依赖
Y ⊈ X 换为 Y ⊆ X ,则 X → Y 为平凡函数依赖 (对于任一关系模式,必然成立) - 完全函数依赖
如果 X → Y ,并且对于 X 的任何一个真子集 X’ , 都有 X’ ↛ Y , 则称 Y 对 X 完全函数依赖,
- 部分函数依赖
- 传递函数依赖
多值依赖MVD
关系模式
五元组 :
- R:符号化的元组语义
- U:一组属性
- F:属性组U中属性所来自的域
- DOM:属性到域的映射
- F:属性组U上的一组数据依赖
把关系模式看作一个三元组:
U ={Sno, Sdept, Mname, Cno, Grade}// 数据冗余、更新异常、插入异常、删除异常
// 分解
S(Sno,Sdept,Sno → Sdept);
SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
DEPT(Sdept,Mname,Sdept → Mname)
范式
范式: 是符合某种基本的关系模式的集合
- 1NF:每个分量必须是不可分开的数据项
- 2NF:符合1NF,每一个非主属性都完全函数依赖于任何一个候选码
- 3NF:符合2NF,消除非主属性对于码传递函数依赖
- BCNF:符合3NF,消除主属性对于码的部分与传递函数依赖
4NF:设R是一个关系模型,D是R上的多值依赖集合。如果D中存在凡多值依赖 X->Y时,X必是R的超码,那么称R是第四范式的模式
满足BCNF:
- 实现了模式的彻底分解
- 最高的规范化程度
- 消除了插入异常和删除异常。
规范化: 低级范式的关系模式通过模式分解,可以转换为若干个高一级范式的关系模式集合的过程。
3NF 和 BCNF的区别
BCNF:如果关系模式R(U,F)的所有属性(包括主属性和非主属性)都不传递依赖于R的任何候选关键字,那么称关系R是属于BCNF的。或是关系模式R,如果每个决定因素都包含关键字(而不是被关键字所包含),则BCNF的关系模式。
例:配件管理关系模式 WPE(WNO,PNO,ENO,QNT)分别表仓库号,配件号,职工号,数量。有以下条件
a.一个仓库有多个职工。
b.一个职工仅在一个仓库工作。
c.每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。
d.同一种型号的配件可以分放在几个仓库中。分析:由以上得 PNO 不能确定QNT,由组合属性(WNO,PNO)来决定,存在函数依赖(WNO,PNO) -> ENO。由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(WNO,PNO)才能确定负责人,有(WNO,PNO)-> ENO。因为 一个职工仅在一个仓库工作,有ENO -> WNO。由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有 (ENO,PNO)-> QNT。
找一下候选关键字,因为(WNO,PNO) -> QNT,(WNO,PNO)-> ENO ,因此(WNO,PNO)
可以决定整个元组,是一个候选关键字。根据ENO->WNO,(ENO,PNO)->QNT,故(ENO,PNO)
也能决定整个元组,为另一个候选关键字。属性ENO,WNO,PNO 均为主属性
,只有一个非主属性QNT
。它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是3NF。分析一下主属性。因为ENO->WNO,主属性ENO是WNO的决定因素,但是它本身不是关键字,只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字(ENO,PNO)的部 分依赖,因为(ENO,PNO)-> ENO但反过来不成立,而P->WNO,故(ENO,PNO)-> WNO 也是传递依赖。
虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。
解决办法:分成管理
EP(ENO,PNO,QNT)
,关键字是(ENO,PNO)工作EW(ENO,WNO)
其关键字是ENO。
缺点: 分解后函数依赖的保持性较差。如此例中,由于分解,函数依赖(WNO,PNO)-> ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此,分解之后的关系模式降低了部分完整性约束。
模式分解实例
函数依赖理论
- 函数依赖集的闭包
- 用于发现所有蕴含的函数依赖
- 属性集的闭包
- 用于判断某属性集能够函数确定的其他因素
- 最小函数依赖集
- 用于寻找等价( 闭包相同) 的最小集,便于降低检测开销
- 无损分解
- 能够通过自然连接恢复原关系的分解策略
- 保持依赖
- 分解后的各子关系函数依赖集并集的闭包与分解前某关系函数依赖集的闭包相同
- 分解后的各子关系函数依赖集并集的闭包与分解前某关系函数依赖集的闭包相同
相关计算
实例:求解函数依赖集的闭包
算法:求属性集X 关于函数依赖集F 的闭包
实例: