数据库系统——3NF与BCNF模式分解
【判定原则】
对于关系模式R,有属性集U和函数依赖集F
3NF:F中任意函数依赖“α→β”的左右属性,都必须是候选码的一部分(或候选码本身)
BCNF:F中所有左边的属性,都是候选码(闭包为U)
(注:这里省略了平凡的情况和只有两个元素的简单情况,它们显然都满足3NF和BCNF)
【分解步骤】:
- 进行BCNF判定,若满足直接结束(肯定也满足3NF)。否则进入下一步
- 求F的正则覆盖Fc,获得候选码
- 判定是否为3NF,若是直接执行第五步
- 3NF分解
- 将R按照Fc中的依赖直接依次拆分成单个关系模式
- 若候选码不在F的关系左侧,则单独添加一个候选码的关系模式
- BCNF分解
- 选择第一个不满足BCNF的函数依赖”α→β”,分解为关系模式R(α, β)和R(α, (U-α-β))
- 计算不含β的新函数依赖集F’,检查R(α, (U-α-β))是否满足条件,若不满足,重复步骤i)。
R1:U(ABCD), F: {AB→C, C→D, D→A}
- Step1:不满足BCNF,计算候选码
- Step2:Fc=F,候选码: AB, BC, CD
- Step3:满足3NF条件,直接进行BCNF分解
- Step4:BCNF分解
- 选择第一个不满足BCNF的函数依赖C→D,分解为R11=CD,R12=CAB
- R12保持函数依赖为F12={AB→C,C→A},依然不满足。取第一个不满足的函数依赖C→A,分解为R121=CA, R122=CB。分解结束
- Step5:综上
- 3NF无需分解
- BCNF分解为{CD, CA, CB}
R2:U(ABCD), F: {B→C, B→D}
- Step1:不满足BCNF,计算候选码
- Step2:Fc={B→CD},候选码: AB
- Step3:不满足3NF条件,进行两次分解
- Step4:3NF分解:
- 直接分解为R21=BCD
- 由于F中不包含候选码,故单独添加:R22=AB
- Step5:BCNF分解
- 选择第一个不满足BCNF的函数依赖B→C,分解为R21=BC,R22=BD,均满足条件
- 由于F中不存在A,故单独添加R23=AB
- Step6:综上
- 3NF分解为{BCD, AB}
- BCNF分解为{BC, BD, AB}
R3:U(ABCD), F: {AB→C, BC→D, CD→A, AD→B}
- Step1:满足BCNF,无需分解。直接结束
- Step2:综上
- 3NF无需分解
- BCNF无需分解
R4:U(ABCD), F: {AB→C, DE→C, B→D}
- Step1:不满足BCNF,计算候选码
- Step2:Fc=F,候选码: ABE
- Step3:不满足3NF条件,进行两次分解
- Step4:3NF分解:
- 直接分解为R41=ABC, R42=DEC, R43=BD
- 由于原F中不包含候选码,故单独添加:R44=ABE
- Step5:BCNF分解
- 选择第一个不满足BCNF的函数依赖AB→C,分解为R41=ABC,R42=ABDE
- R42保持函数依赖为F42={B→D},依然不满足。取第一个不满足的函数依赖B→D,分解为R421=BD, R422=BAE。均满足条件。
- Step6:综上
- 3NF分解为{ABC, DEC, BD, ABE}
- BCNF分解为{ABC, BD, BAE}
R5:U(ABCDEF), F: {A→B, C→DF, AC→E, D→F}
- Step1:不满足BCNF,计算候选码
- Step2:Fc={A→B, C→D, AC→E, D→F},候选码: AC
- Step3:不满足3NF条件,进行两次分解
- Step4:3NF分解:
- 直接分解为R51=AB, R52=CD, R53=ACE, R53=DF
- Step5:BCNF分解
- 选择第一个不满足BCNF的函数依赖A→B,分解为R51=AB,R52=ACDEF
- R52保持函数依赖为F52={C→D, AC→E, D→F},依然不满足。取第一个不满足的函数依赖C→D,分解为R521=CD, R522=CEFA
- R522保持函数依赖为F522={AC→E, C→F},依然不满足。取第一个不满足的函数依赖C→F,分解为R5221=CF, R5222=CAE, 均满足条件。
- Step6:综上
- 3NF分解为{AB, CD, ACE, DF}
- BCNF分解为{AB, CD, CF, CAE}
var code = "dc0f7f0c-36cb-4edd-afe7-e3ecf962631d"