第一范式(1NF):
- 数据表的每一列是基本列,不可再拆分(下面的表1的结构则不符合第一范式,当然,目前在用的各种数据库也不允许创建这种表)
- 不可有重复列
第二范式(2NF):
- 数据表必须有主键(关键字或组合关键字)以区分各行数据
- 非关键字段不允许存在对关键字的部分依赖
举例:
假定选课关系表为SelectCourse(学号,姓名,年龄,课程名称,成绩,学分)
关键字为组合关键字(学号,课程名称),决定关系关系如下:
(学号,课程名称) → (姓名,年龄,成绩,学分)
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称) → (学分)
(学号) → (姓名,年龄)`
即存在组合关键字中的某字段决定非关键字的情况。
满足2NF的数据表设计示例:
把选课关系表SelectCourse改为如下三个表:
学生:Student(学号,姓名,年龄);
课程:Course(课程名称,学分);
选课关系:SelectCourse(学号,课程名称,成绩)。
第三范式(3NF):
- 不允许传递依赖
满足第三范式的数据库表不允许存在如下依赖关系:
关键字段 → 非关键字段x → 非关键字段y
BC范式(BCNF):
- 不允许关键字间的依赖
关键字互相决定
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
第四范式(4NF):
- 消除表中的多值依赖关系
举例:
有这样一个关系 <仓库管理员,仓库号,库存产品号> ,假设一个产品只能放到一个仓库中,但是一个仓库可以有若干管理员,那么对应于一个 <仓库管理员,库存产品>有一个仓库号,而实际上,这个仓库号只与库存产品号有关,与管理员无关,就说这是多值依赖。