范式介绍
- 目前关系型数据库有6种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称完美范式)。一般来说,数据库只需要满足第三范式就行。
第一范式(1NF)
- 数据库表中的字段都是单一属性的,不可再分。只要是关系数据库都满足第一范式。这个单一属性由基本类型构成,包括整型、字符串、日期型等。
- 如病人信息表,有
病人编号
、姓名
、性别
、就诊记录
、联系方式
(住宅电话
、手机号
),此时联系方式不能是一个包含住宅电话和手机号的字段,而是2种联系方式各为一个字段。
第二范式(2NF)
- 是在1NF的基础上建立起来的。第二范式要求实体的属性完全依赖于主关键字,即非关键字段都依赖于主键。不能有多个主关键字。
- 在病人信息表中增加
医生编号
,医生姓名
,医生性别
、职称
、科室编号
、科室名称
、负责人
、诊室号
字段,那么此时表中存在着2种依赖关系:
1、{病人编号}<-{姓名,性别,就诊记录,联系方式}
2、{医生编号}<-{医生姓名,医生性别,职称,科室编号,科室名称,负责人,诊室号}
可见,此时出现了2个关键字,2种依赖关系,不符合第二范式。同时从表里的数据来看,出现了冗余数据:3名患者找同一个医生看病时,与医生有关的信息就重复了3次。 - 将新增的所有字段拿出来单独构成医生信息表,再创建一张病人挂号信息表(
挂号单流水号
,病人编号
,医生编号
);此时共有3张表,非关键字段都依赖于主键,符合第二范式,但是这样拆分不符合第三范式。
第三范式(3NF)
- 第三范式是第二范式的一个子集,即满足第三范式必须满足第二范式。即不存在非关键字段对任一候选关键字段的传递函数依赖。
- 在以上的医生信息表中,存在着不符合第三范式的关系:
1、{医生编号}<-{姓名,性别,职称}
2、{科室编号}<-{科室名称,负责人,诊室号}
科室名称依赖着科室编号、科室编号依赖着医生编号,存在数据冗余,不符合第三范式,可将表再进行拆分。
医生信息表(医生编号
,姓名
,性别
,科室编号
)
科室信息表(科室编号
,科室名称
,负责人
,诊室号
)