-
第一范式(1NF)
符合1NF的关系中的每个属性不可再分。以下就不符合
仅仅符合1NF的设计,会存在数据冗余,插入异常,删除异常,修改异常的问题
例如
- 每一个学生的学号、姓名、系名、系主任这些数据重复多次——数据冗余过大
- 假如学校新建了一个系,诞生暂时还有新生 ,那么系名和系主任将无法插入——插入异常
- 假如某个系中所有学生相关记录都删除,那么所有系与系主任也就随之消失了。——删除异常
- 假如小明转系到法律系,那么为了保证数据库的一致性,需要修改三条记录中系与系主任的数据——修改异常
-
第二范式
2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
- 函数依赖
若在一张表中,在属性x的值确定的情况下,必定能确定属性Y的值,则可以说函数Y依赖于函数X,写作X→Y
比如学号→姓名,而姓名有重复不能百分百确定学号是什么所以不能姓名→学号。 - 完全函数依赖
对于X的任何一个真子集,X(真子集)→Y不成立,那么我们称Y对于X完全函数依赖。记作XF→Y - 部门函数依赖
假如Y函数依赖于X,但同时Y并不完全函数依赖于X,那么我们就称Y部分函数依赖于X,记作XP→Y - 传递函数依赖
假如Z函数依赖于Y,且Y函数依赖于X(Y不包含于X,且X不函数依赖于Y),那么我们就称Z传递函数依赖于X,XT→Z. - 码
若属性或属性组K之外的所有属性都完全函数依赖于K,那么我们称K为候选码,简称码,在实际中可以理解为:假如当K确定的情况下,该表除K之外的所有属性的值也就随之确定,那么K就是码。 - 主属性和非主属性
包含在任何一个码中的属性是主属性,其他的是非主属性。 - 判断2NF
就是看表中是否存在非主属性对于码的部分函数依赖。
判断方法是- 找出数据表的码
- 根据第一步的码,找出主属性和非主属性
- 看是否存在部门函数依赖
在(学号、课名)→姓名中,因为课名→姓名是部门函数依赖,所以不符合。
- 要达到2NF就可能需要拆分表。拆到符合第二范式。
然而删除异常和插入异常仍没有改进
-
第三范式3NF
在前两个范式的基础之上,消除了非主属性对吗的传递函数依赖。
方法仍然是拆分拆分拆分到符合范式。
-
BCNF范式
解决办法就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。