// 数据库老师始终不见,埋头看书苦不堪言。遇到范式更是难解,真就自己阅读自学。好诗好诗
范式简介
数据库范式是一种规范。类似同心圆,最外面一层要求最低,最里面要求最高。
规范的要求从低到高分别为:1NF 2NF 3NF BCNF 4NF 5NF
在日常使用中数据库能达到3NF的要求就已经很严苛,根据BCNF划分新的表一般也不会超过一次。但谁叫我们要做题呢~~
范式对应要求
级别高的范式包含比它级别低的范式的要求
1NF
1NF:关系中的每个属性都不可再分
- 这是表结构的基本要求,能写在数据库中的表都满足
2NF
2NF:消除非主属性对候选键的部分函数依赖(码 -P> 非主)
- P应该标识在箭头上方
- Y 函数依赖于X,但同时Y并不完全函数依赖于X,就称 Y 部分函数依赖于X。例:(学号,课名) -P> 姓名
- 码又叫候选键。候选键是指能唯一标识元组的一个或多个属性的集合
- 所有候选键的并集就叫主属性
- R中除去主属性以外的属性就叫非主属性
3NF
3NF:消除非主属性对候选键的传递函数依赖(码 -T> 非主)
- Z函数依赖于Y,且Y函数依赖于X,称Z传递函数依赖于X。例:A->D D->C
BCNF
BCNF:消除主属性对候选键的部分、传递函数依赖( 码 -PT>主 )
BCNF解题思路
BCNF解题步骤
1、求出R中所有FD左侧的闭包,取一个闭包{X}+,若能包含R中的所有元素,则该FD满足BCNF
2、如果不能包含R中所有元素,则将R分解成两个关系R1、R2,{X}+作为R1的元素,X与R中剩余元素作为R2的元素
3、对R1、R2递归处理上述步骤
在这里解释一下为什么要引入闭包:
{X}+定义就是由X直接或间接推导出的所有元素的集合。而这恰是部分函数依赖和传递依赖的性质。所以说闭包是他俩的具体应用!
BCNF例题
已知R(A,B,C,D,E) 含有FD:AB->C C->D D->B D->E,求根据BCNF分解的新集合。
- 先把R中所有FD的左侧对应的闭包写出来
{A,B}+={A,B,C,D,E}
{C}+={B,C,D,E}
…
其实不用列完,发现第二个就已经不满足,那就根据第二个进行分解 - 根据{C}+分解R
R1={B,C,D,E} R2={A,C}
R2已经只有两个元素了,必定满足BCNF规范,所以不用考虑,接下来继续考虑R1是否满足BCNF - 将R1中所有FD的左侧对应的闭包写出来
{D}+={B,D,E}
…
出现了不满足的闭包,则继续分解R1 - 根据{D}+分解R1
R3={B,D,E} R4={C,D}
R4不需再分,接下来考虑R3是否满足BCNF - 将R3中所有FD的左侧对应的闭包写出来
{D}+={B,D,E}
R3中所有闭包满足条件,递归分解结束
后话
由于我才做到BCNF的题目,这里就暂时只有这个。以后会陆续更新。
这次的博客我参考了许多资料,最后其实感觉也挺简单。
喜欢的话记得关注。