1NF | 2NF | 3NF的区分以及什么是函数依赖、部分函数依赖、值传递依赖
符合3NF一定符合2NF、一定符合1IF
简单区分。2NF不存在部分函数依赖,3NF不存在传递函数依赖
第一范式1NF
- 符合1NF的关系中的每个属性都不可再分。
第二范式2NF
- 消除了1NF非主属性对主属性的部分函数依赖。
函数依赖:在属性(属性组)X的值确定的情况下,必定能够确定属性Y的值。
例如:学号–>班主任。(学号,课程名称)–>分数。
完全函数依赖:在一张表中,如果X–>Y,对于X的任意子集都不能确定Y。
例如(学号,课程)–>分数。单独的学号、和课程都不能确定分数。一个学号多个课程分成绩,一个课程对应多个同学的成绩。只能由学号和课程共同确定具体的分数。
部分函数依赖:Y函数依赖X函数,但是Y函数不完全依赖X函数。就称函数Y部分依赖函数X。
例如:(学号,课程名)–>姓名。一个学号对应一个学生姓名,但是课程名并不能对应具体的学生。
传递函数依赖:Z函数依赖Y函数,Y函数依赖X函数(Y不包含X,X不依赖Y前提)。Z函数依赖X函数。
判断是否是2NF:查看表中是否存在非主属性对于码的部分函数依赖。不存在部分函数依赖就是2NF
判断方法:
- 1、找出数据表所有的码
- 2、根据码找出主属性
- 3、找出非主属性
- 4、查看非主属性对码的部分函数依赖
找码的过程:
1、查看一个单一属性,其他属性值是否都能确定
2、查看两个属性:其他属性值能否全部确定
3、…
例如:(学号,课名,姓名,系名,系主任,分数)。
单一的学号不能确定分数,分数的确定需要学号和课程。
码(学号,课名)
(学号,课名)–>系名.单独的学号就可以确定。部分依赖
…
改为2NF,消除部分依赖
将分数搞出去,选课(课程名,学号,分数)
学生(学号,姓名,系名,系主任)
选课的码(课程名,学号)–>分数
学生的码(学号)–> 只有一个主属性,不存在部分函数依赖
第三范式:3NF
- 消除了非主属性对码的传递函数依赖。
选课表(课程名,学号,分数)不存在传递函数依赖。(课程名,学号)为主码,传递也需要另外两个属性。
学生表中,学号–>系名。系名–>系主任。存在传递函数依赖。不符合3NF。
消除这个传递函数依赖
系(系名、系主任)
学生(学号,姓名,系名)