范式
关系数据库中的关系要满足一定要求的,满足不同程度的要求的为不同的范式。
各种范式之间的关系
5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF
- 1NF:
作为一个二维表,关系要符合一个最基本的田间,每个分量必须是不可分的数据项,即具有原子性。
1NF强调的是列的原子性,即列的属性不可再拆分。比如下表包含「姓名」、「性别」、「电话」字段。但是在实际应用场景中,「电话」是可以被拆分为「家庭电话」以及「工作电话」的。所以我们说,「电话」这一列不符合原子性原则,也就是说这个表不符合1NF。
正确的做法应该是将「电话」拆分为「家庭电话」和「工作电话」。
(总结:就是一个表中的属性,不能拆分成多个就说这个表符合第一范式)。
- 2NF
在第一范式的基础上,没有非主属性对于码的部分函数依赖。即每个非主属性完全依赖于任何一个候选码
举例学生成绩表(学号,姓名,科目,成绩,所属院系,系主任)
此表中由于成绩是由科目和学号共同确定的,只有当学号确定,科目确定,才能知道成绩。
所以这个表的码就是(学号,科目)这两个组成的。然后就是说主属性是学号和科目,非主属性是姓名,成绩,所属院系,系主任。
因为姓名可以不需要科目只由学号单独就能确定出来,所以说非主属性(姓名)部分函数依赖于码(学号,科目)。所以此表不符合第二范式,要想他符合2NF必须将此表分成两个表:学生表(学号,姓名,所属院系,系主任),成绩表(学号,科目,成绩)。
- 3NF
不存在非主属性对码的部分函数依赖和传递函数依赖。
举例学生表(学号,姓名,所属院系,系主任)
在这个表中,主属性是学号,由学号可以确定其他的属性,
但是由以下情况 学号–>所属院系,所属院系–>系主任 学号–>系主任
学号可以确定所属院系,所属院系可以确定系主任,学号又可以确定系主任
具有传递关系,即存在非主属性(系主任)对码(学号)的传递函数依赖,所以不符合第三范式。
要想符合3NF就拆分表:学生表(学号,姓名,所属院系) ,院系表(院系,系主任)。