(1)1NF
定义:所有的属性均为原子属性,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
弊端:如果仅仅符合第一范式的设计,仍然会存在数据冗余过大,插入异常,删除异常,修改异常的问题,例如:
1.表中学生的学号、姓名、系名、系主任等数据重复出现--------数据冗余过大。
2.假如学校3月份新创建了一个系,等到9月份的时候才能招收学生,那么无法将该系名与系主任单独添加到数据表中----插入
异常。
3. 假如将某个系的所有学生相关数据都删除,那么该系与系主任的数据也就随之消失了-----删除异常。
4. 如果将学生李小明转到法律系,则需要修改3行表数据-----修改异常。
(2)2NF
定义:表中的所有属性都必须完全依赖于所有主键(主键可能由多个属性构成),不能存在依赖部分主键的情况。
满足第二范式后上表就成为:
进行第一范式上表中的操作:
1. 学生的姓名、学号、系名、系主任不没有重复出现-------有改进。
2.添加一个尚无学生的新系,因为学生表的码是学号,不能为空,所以添加失败-------无改进。
3.删除某个系中所有学生的记录,该系的信息仍然全部丢失-------无改进。
4.将学生李小明转移到法律系,只需要修改一次李小明对应的系的值即可-------有改进。
(3)3NF
定义:一张表中的非主属性不能与非主属性之间存在依赖关系,如第2NF学生表存在学号->系名,系名->系主任,而系名和系主任都是非主属性,不满足3NF。
满足第三范式后上表就成为:
进行第二范式上表中的操作:
1.删除某个系中的所有学生相关记录,该系的信息不会丢失------有改进。
2.插入一个尚无学生的新系的信息,因为系表与学生表是两张独立的表,所以不影响------有改进。