第一范式
第一范式是第二第三范式的基础,是最基本的范式。第一范式包括下列指导原则
- 数据组的每个属性只可以包含一个值
- 关系中的每个数组必须包含相同数量的值
- 关系中的每个数组一定不能相同
强调的是列的原子性,即列不能够再分成其他几列
在第一范式中,数据表的每一个行只包含一个实体的信息,并且每一行的每一列只能存放实体的一个属性。比如,对于学生信息,不可以将学生实体的所有属性信息(如学号、姓名、性别、年龄、班级等)都放在一个列中显示,也不能将学生实体的两个或多个属性信息放在一个列种显示,学生实体的每个熟悉信息都应放在一个列中显示。
如果数据表中的列信息都符合第一范式,那么在数据表中的字段都是单一的,不可再分的。如表1.1就是不符合第一范式的学生信息表,因为“班级”列中包含了“系别”和“班级”两个属性信息,这样“班级”列中的信息就不是单一的,是可以再分的,违反了第一范式的原子性原则。
学号 | 姓名 | 性别 | 年龄 | 班级 |
---|---|---|---|---|
9527 | 东方 | 男 | 20 | 计算机3班 |
表1.1 不符合第一范式的学生信息表
学号 | 姓名 | 性别 | 年龄 | 系别 | 班级 |
---|---|---|---|---|---|
9527 | 东方 | 男 | 20 | 计算机 | 3班 |
表1.2 符合第一范式的学生信息表
第二范式
第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。第二范式要求数据库表中的每个实体(即各个记录行)必须可以被唯一地区分。为实现分各行记录通常需要为表设置一个“区分列”,用以存储各个尸体的唯一标识。这个唯一属性列被称为主关键字或主键。
另外没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分,如果存在,那么这个熟悉和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
这里以“员工工资表”为例,若以“员工编号,岗位”为组合关键字(即复合主键),就会存在如下决定关系。
(员工编号,岗位)->(决定) (姓名、年龄、学历、基本工资、绩效工资、奖金)
在上面的决定关系中,还可以进一步拆分为如下两种决定关系:
(员工编号)->(决定) (姓名、年龄、学历)
(岗位)->(决定) (基本工资)
其中,员工编号决定了员工的基本信息(包括姓名、年龄、学历等);而岗位决定了基本工资,所以这个关系不满足第二范式。
对于上面的这种关系,可以把上述两个关系表更改为如下3个表:
员工档案表:EMPLOYEE(员工编号,姓名,年龄,学历)
岗位工资表:QUARTERS(岗位,基本工资)
员工工资表:PAY(员工编号,岗位,绩效工资,奖金)
第三范式
在满足第二范式的基础上另外要求非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
这里以员工信息表(EMPLOYEE)为例,该表包含员工编号、员工姓名、年龄、部门编号、部门经理等信息,该关系表的关键字为“员工编号”,因此存在如下决定关系:
(员工编号)->(决定) (员工姓名、年龄、部门编号、部门经理)
上面这个关系表是符合第二范式的,但它不符合第三范式,因为该表内部隐含着如下决定关系:
(员工编号)->(决定) (部门编号)->(决定) (部门经理)
上面的关系表存在非关键字段“部门经理”对关键字段“员工编号”的传递函数依赖。对于上述关系,可以吧这个关系表(EMPLOYEE)更改为如下两个关系表:
员工信息表:EMPLOYEE(员工编号,员工姓名,年龄,部门编号)
部门信息表:DEPARTMENT(部门编号,部门经理)