sql 范式:1NF、2NF、3NF、BCNF(函数依赖)
第一范式(1NF)
每个属性都是不可分的基本数据项.(必须有主键,列不可分)
eg:非第一范式的表:(列可再分)
学院名称 | 高级职称人数 | |
教授 | 副教授 | |
信电学院 | 3 | 34 |
管理学院 | 5 | 23 |
外语学院 | 3 | 12 |
满足第一范式的表
学院名称 | 教授 | 副教授 |
信电学院 | 3 | 34 |
管理学院 | 5 | 23 |
外语学院 | 3 | 12 |
第二范式(2NF)
1NF基础上消除部分函数依赖, 消除数据冗余和增、删、改异常。
每个非主属性都完全函数依赖于主键
2NF关系举例:
不满足2NF的关系:
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
满足2NF的关系:
(完全函数依赖:在关系模式R(u)中,X,Y是U的子集,Y函数依赖于X 并且 Y非函数依赖于X的子集,则称Y完全函数依赖于X。X f >Y)
(部分函数依赖:在关系模式R(u)中,X,Y是U的子集,Y函数依赖于X 并且 Y函数依赖于X的子集)
(函数依赖:某个属性集决定另一个属性集时,例如学生学号属性集Sno决定学生姓名属性集Sname,称Sname函数依赖于Sname )
(平凡函数依赖:Y函数依赖于X,并且Y包含于X,例如(Sno)->(Sno)、(Sno、Sname)->(Sno))
(非平凡函数依赖:Y函数依赖于X,并且Y不包含于X,例如(Sno,Sname)->(Ssex))
第三范式(3NF)
2NF基础上消除传递函数依赖,属性集直接依赖于主键。
非第三范式表(Sno->BounsLevel,BounsLevel->BounsMoney)
Sno | Sname | Sage | BounsLevel | BounsMoney |
1 | Carrie | 21 | A | 2000 |
2 | Cherry | 20 | B | 1500 |
第三范式表:(消除传递函数依赖)
Sno | Sname | Sage | Bno |
1 | Carrie | 21 | 1 |
2 | Cherry | 20 | 2 |
Bno | BounsLevel | BounsMoney |
1 | A | 2000 |
2 | B | 1500 |
(传递函数依赖:Y函数依赖于X,Z函数依赖于Y,且X不包含Y,X非函数依赖于Y,则称Z传递函数依赖于X。X t >Z)
鲍依斯-科得(巴斯)范式(BCNF)
3NF基础上消除主属性依赖,即不存在关键字段决定关键字段的情况。
(非主属性 :不包含在主码中的属性称为非主属性。)
反例:(SID->GID,GID->SID存在关键字决定关键字的情况)
SID(仓库ID) |
GoodsID(商品ID) |
MID(管理员ID) |
GoodsNum(商品数量) |
001 |
20170510 |
1 |
200 |
符合BCNF
StoreHouseID(仓库ID) |
GoodsID(商品ID) |
GoodsNum(商品数量) |
001 |
20130104 |
200 |
StoreHouseID(仓库ID) |
ManagerID(管理员ID) |
001 |
1 |