文章目录
一、为什么数据库需要规范化?
- 数据库规范化是为了减少数据库中的数据冗余,增进数据的一致性
- 现在数据库设计最多满足3NF。因为普遍认为范式过高,虽然具有对数据关系更好的约束性,但也导致数据关系表增加而增加成本。
二、函数依赖
1.部分函数依赖
- 在一个关系R中,X,Y是关系R的两个属性集合,存在X→Y,若X‘是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
2.完全函数依赖
- 在一个关系R中,X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
3.传递函数依赖
- 在一个关系R中,X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
三、关系的规范化
1.第一范式(1NF)
- 满足以上条件即为第一范式。
2.第二范式(2NF)
-
满足1NF
-
每一个非码属性完全依赖于任何一个候选码(在第一范式的基础上消除非码属性对于候选码的部份依赖)
-
例:关系模式R(A,B,C,D) 函数依赖F{(A,B)->C,A->D}
-
候选码:AB
-
不是2NF,因为A->D,即存在非码属性对于候选码的部份依赖
-
改进为2NF:R1(A,B,D) R2(A,D)
3.第三范式(3NF)
- 满足2NF
- 不能存在非码属性对码的传递依赖
- 例:R(A,B,C,D) F{ A->BC,B->D}
- 候选码:A
- 不是3NF,因为 A->B,B->D,即存在非码属性对码的传递依赖
- 改进为3NF:R1(A,B,C)R2(B,D)
4.BC范式(BCNF)
- 满足3NF
- 决定因素都包含候选码。
- 例:R(A,B,C,D,F)F{(A,B)->C,(A,B)->E,(C,D,E)->AB}
- 候选码:ABD,CDE
- 不是BCNF,因为 (A,B)->C,AB是决定因素,但不包含候选码,即存在非码属性对码的传递依赖
- 改进: