1. 1NF
实体的属性是不可再分的数据项。
2. 2NF
满足1NF且每一个非主属性完全依赖于码。
比如说:
学生(学号,所在系, 住址,课程号,成绩),约定为每个系的学生住同一个地方。
这里码为(学号, 课程号),函数依赖有:
(学号, 课程号) --> 成绩 【完全依赖】
(学号) --> 所在系, (学号, 课程号) --> 所在系 【部分依赖】
(学号) --> 住址, (学号, 课程号) --> 住址 【部分依赖】
这个关系部属于2NF,就会产生以下几个问题:
(1) 插入异常。假如插入一个学生:学号=001, 所在系="计算机, 住址="成都",但该学生还没选课,
即这个学生没有课程号,所以无法插入数据库。因为码值是(学号,课程号),课程号为空,所以学生
固有信息无法插入。
(2) 删除异常。如果删除一门课程,学生的固有信息也被删除了,造成删除异常。
(3) 修改复杂。 如果学生从计算机系转入到数学系,则除了修改所在系信息,还要修改住处。因为
对该关系来说,学生转系时住处也会相应改变。另外,如果学生选修了k门课程,则该学生系和
住址重复存储了k次,造成修改的复杂化。
所以,该关系要重新拆分,拆分如下:
(学号,课程号,成绩)
(学号,所在系,住址)
3. 3NF
满足2NF且每一个非主属性既不部门依赖于码也不传递依赖于码。
比如:在(学号,所在系,住址)关系中:
学号->所在系
学号->住址
所在系->住址 (因为约定每个系的学生住同一个地方)
所以该关系有传递依赖。所以要重新拆分:
(学号,所在系)
(所在系,住址)
4. BCNF
满足3NF且每一个决定因素都包含码。有三层意思
(1) 所有的非主属性对每一个码都是完全函数依赖。
(2) 所有的主属性对每一个不包含它的码,也是完全函数依赖。
(3) 没有任何属性会完全依赖于非码的任何一组属性。
比如:
S(学号,姓名,所在系,年龄)
假定姓名也具有唯一性,那么S就有两个码,这两个码由单个属性组成,彼此不相交。其他属性不存在对码的部分依赖于传递依赖,
所以属于3NF,同时,S中除学号外,姓名并没有其他决定因素,所以S也属于BCNF。
在比如:
C(课程号,课程名称,课时)
C只有一个码,且课程号是唯一的决定因素,没有任何属性对课程号部分依赖或传递依赖,所以C属于BCNF。
实体的属性是不可再分的数据项。
2. 2NF
满足1NF且每一个非主属性完全依赖于码。
比如说:
学生(学号,所在系, 住址,课程号,成绩),约定为每个系的学生住同一个地方。
这里码为(学号, 课程号),函数依赖有:
(学号, 课程号) --> 成绩 【完全依赖】
(学号) --> 所在系, (学号, 课程号) --> 所在系 【部分依赖】
(学号) --> 住址, (学号, 课程号) --> 住址 【部分依赖】
这个关系部属于2NF,就会产生以下几个问题:
(1) 插入异常。假如插入一个学生:学号=001, 所在系="计算机, 住址="成都",但该学生还没选课,
即这个学生没有课程号,所以无法插入数据库。因为码值是(学号,课程号),课程号为空,所以学生
固有信息无法插入。
(2) 删除异常。如果删除一门课程,学生的固有信息也被删除了,造成删除异常。
(3) 修改复杂。 如果学生从计算机系转入到数学系,则除了修改所在系信息,还要修改住处。因为
对该关系来说,学生转系时住处也会相应改变。另外,如果学生选修了k门课程,则该学生系和
住址重复存储了k次,造成修改的复杂化。
所以,该关系要重新拆分,拆分如下:
(学号,课程号,成绩)
(学号,所在系,住址)
3. 3NF
满足2NF且每一个非主属性既不部门依赖于码也不传递依赖于码。
比如:在(学号,所在系,住址)关系中:
学号->所在系
学号->住址
所在系->住址 (因为约定每个系的学生住同一个地方)
所以该关系有传递依赖。所以要重新拆分:
(学号,所在系)
(所在系,住址)
4. BCNF
满足3NF且每一个决定因素都包含码。有三层意思
(1) 所有的非主属性对每一个码都是完全函数依赖。
(2) 所有的主属性对每一个不包含它的码,也是完全函数依赖。
(3) 没有任何属性会完全依赖于非码的任何一组属性。
比如:
S(学号,姓名,所在系,年龄)
假定姓名也具有唯一性,那么S就有两个码,这两个码由单个属性组成,彼此不相交。其他属性不存在对码的部分依赖于传递依赖,
所以属于3NF,同时,S中除学号外,姓名并没有其他决定因素,所以S也属于BCNF。
在比如:
C(课程号,课程名称,课时)
C只有一个码,且课程号是唯一的决定因素,没有任何属性对课程号部分依赖或传递依赖,所以C属于BCNF。