关系范式详解
1 前言关系模式规范化过程函数依赖:若 Y=f(X) ,则称X函数决定Y,或Y函数依赖于X,记为:X->Y。在数据库中,通常将X置为关键字,将Y置为非主属性。2 范式2.1 1NF1NF定义:关系的所有分量都必须是不可分的最小数据项。如日期可以拆分为年、月、日三项。2.2 2NF2NF定义:满足1NF,且每个非主属性都完全依赖于关键字,即不存在非主属性部分依...
1 前言
函数依赖:若 Y=f(X) ,则称X函数决定Y,或Y函数依赖于X,记为:X->Y。在数据库中,通常将X置为关键字,将Y置为非主属性。
2 范式
2.1 1NF
1NF定义:关系的所有分量都必须是不可分的最小数据项。
如日期可以拆分为年、月、日三项。
2.2 2NF
2NF定义:满足1NF,且每个非主属性都完全依赖于关键字,即不存在非主属性部分依赖于关键字。
单关键字中非主属性一定是完全依赖于关键字,所以所有单属性关键字关系都是2NF关系。
案例:存在关系(A,B,C,D,E,F)(下划线表示关键字,下同),具体依赖关系如下:(蓝色表示关键字,橙色表示非主属性,下同)
A、B为关键字,但是D、F都只依赖于B,所以不是2NF,可以将其拆分为两个关系,使其满足2NF:
(A,B,C,E)、(B,D,F),具体关系如下:
2.3 3NF
3NF定义:满足2NF,且每个非主属性都不传递依赖于关键字,即不存在非主属性传递依赖于关键字。
案例:存在关系(A,B,C,D,E),具体依赖关系如下:
A、B为关键字,但是E传递依赖于A、B,所以不是3NF,可以将其拆分为两个关系,使其满足3NF:
(A,B,C,D)、(D,E),具体关系如下:
2.4 BCNF
BCNF定义:满足3NF,且不存在主属性依赖于非主属性(关系图中不存在回路)
特别的,满足1NF的全关键字关系一定是BCNF(因为全关键字关系没有非主属性)
案例:存在关系(A,B,C,D),具体依赖关系如下:
A、B为关键字,但是主属性A依赖于非主属性D(即存在回路),所以不是BCNF,可以破坏回路,使其满足BCNF:
从3NF到BCNF的分解不能保证保持函数依赖,但可以保证无损连接。
3NF和BCNF只是在函数依赖的前提下对模式分解程度的一个测度,一个关系关系模式如果属于BCNF,那么在函数范畴内已实现了彻底的分解;3NF分解不彻底的原因是由于存在主属性对非主属性的函数依赖。
2.5 4NF
多值依赖:设有关系模式 R(U) ,X、Y、Z是U的子集,Z=U-X-Y,如果对于X的一个给定值,存在一组Y值与其对应,而Y又不与Z相关,则称Y多值依赖于X,记为X->->Y。
注意:“依赖”前没有“函数”二字,函数依赖是指非主属性与关键字之间的关系。
平凡的多值依赖:若Z为空,则将多值依赖X->->Y称为平凡的多值依赖。
非平凡多值依赖:若Z非空,则将多值依赖X->->Y称为非平凡多值依赖。
4NF定义:满足BCNF,且不存在非平凡多值依赖
消除BCNF中的非平凡多值依赖,使其变为平凡的多值依赖,即可得到4NF。
案例:存在关系(A,B,C),具体依赖关系如下:
A | B | C |
WH1 | E1 E2 | P1 P2 P3 |
WH2 | E1 E3 | P2 P4 |
显然有A->->B,A->->C,它们都是非平凡的多值依赖,可以将其拆分为两个表:(A,B)、(A,C),在表(A,B)中,A->->B是平凡的多值依赖,在表(A,C)中,A->->C是平凡的多值依赖,所以分解后的关系满足4NF。分解图如下(虚线表示多值依赖):
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)