三大范式

今天我们来讲讲数库设计的三大范式:

  • 1NF(第一范式)[确保每列保持原子性]

  第一范式是只数据库表中的每一项都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。第一范式的模式要求属性值不可再分裂为更小部分,及属性项不能是属性组合或是由一组属性构成。

  简而言之,第一范式就是无重复的列。如果有个由name,phone两列组成的表,而一个人可能有英文名和中文名,此时将其规范化为1NF为:name_cn,name_en,phone。

  • 2NF(第二范式)[确保表中的每列都和主键相关]

  第二范式是第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。2NF要求数据库表中的每个实例或者每一行必须可以被唯一区分。为实现区分通常需要为表加上一个列,已存储各个实例的唯一标识。

  例如,在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但由于非主属性【学分】仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,因此此种方式会导致数据冗余以及更新异常等问题。解决办法就是将其分为两个关系模式:学生表(学号,课程号,成绩)和课程表(课程号,学分),新关系通过学生表中的外关键字(课程号)联系,在需要时进行连接。

  • 3NF(第三范式)[确保每列都和主键列直接相关,而不是间接相关]

  如果关系模型R是第二范式,且每个非主属性都不传递依赖于R的候选键,则成R是第三范式的模式。

  注意,2NF是关系中存在传递依赖,但不存在部分依赖的关系,3NF是关系中既不存在部分依赖,也不存在传递依赖的关系。

  例如:

  有关系R(学生学号,课程号,成绩,课程名,学分,教师编号,教师性别,教师职称),在这个关系中,主码是(学生学号,课程号),但是由于(课程名,学分,教师编号,教师性别,教师职称)仅依赖于课程号,因此对于主码(学生学号,课程号)只是部分依赖,因此不属于2NF,要修改为2NF:

  R1(学生学号,课程号,成绩),R2(课程号,成绩,课程名,学分,教师编号,教师性别,教师职称)

  此时R2的主码为课程号,各个非主属性对主码的依赖关系有:课程号→课程名,课程号→学分,课程号→教师编号,另外还存在依赖关系:教师编号→教师性别,教师编号→教师职称,即所在教师性别对主码(课程号)存在传递依赖,教师职称对主码(课程号)存在传递依赖,所以不属于属于3NF,分解为3NF:

  R21(课程号,课程名,学分,教师编号),R22(教师编号,教师性别,教师职称)

以上。

相关推荐