数据库三范式

Posted by JimWang on 2021-02-20

数据库三范式

第一范式

列不可分

1NF(第一范式)是对属性具有原子性的要求,不可再分。
比如:

学号 姓名 性别 出生年月日

如果认为年月日可以分为年、月、日。那么这就不满足1NF

第二范式

消除非主属性对码对部分函数依赖

2NF(第二范式)是对记录有唯一性的要求,即实体的唯一性,不存在部分依赖,每一列与主键都相关

比如:

学号 课程号 姓名 学分

该表明显说明了:学生信息和课程信息。正常的依赖应该是:学分依赖课程号,姓名依赖学号。但是这里非主键字段对码的部分依赖,即与主键不相关,不满足第二范式的要求。

这里的主键是学号和课程号,姓名部分依赖,只依赖学号,而学分也是部分依赖,只依赖课程号

可能存在的问题:

  • 数据冗余:每条记录都含有相同信息;
  • 删除异常:删除所有学生成绩,就把课程信息全删除了;
  • 插入异常:学生未选课,无法记录进数据库;
  • 更新异常:调整课程学分,所有行都调整。

正确的做法:

课程号 学分
学号 姓名
学号 课程号

第三范式

消除非主属性对码的传递函数依赖

3NF对字段有冗余性对要求,任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖。

比如:

学号 姓名 年龄 学院 学院电话

明显,学院电话是冗余,存在依赖传递关系学号->姓名->学院->学院电话

这里学院电话是直接依赖于学院,通过传递关系,间接的依赖于主键学号

可能会存在的问题:

  • 数据冗余:有重复值;
  • 更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 。
    正确的做法:
学号 姓名 年龄 学院
学院 学院电话

区分第二范式和第三范式

第二范式是非主键对主键的部分依赖。也就是说主键有多个属性,但是非主键只依赖以其中的一部分,而不是全部。

第三范式是在第二范式的基础上,强调非主键必须直接依赖于主键,不能是传递关系。


部分转载自:https://www.yuque.com/fanzhengxu/tba6b8/dx0hvw