数据库三范式
第一范式
列不可分
1NF(第一范式)是对属性具有原子性的要求,不可再分。
比如:
学号 | 姓名 | 性别 | 出生年月日 |
---|
如果认为年月日可以分为年、月、日。那么这就不满足1NF
第二范式
消除非主属性对码对部分函数依赖
2NF(第二范式)是对记录有唯一性的要求,即实体的唯一性,不存在部分依赖,每一列与主键都相关
比如:
学号 | 课程号 | 姓名 | 学分 |
---|
该表明显说明了:学生信息和课程信息。正常的依赖应该是:学分依赖课程号,姓名依赖学号。但是这里非主键字段对码的部分依赖,即与主键不相关,不满足第二范式的要求。
这里的主键是学号和课程号,姓名部分依赖,只依赖学号,而学分也是部分依赖,只依赖课程号
可能存在的问题:
- 数据冗余:每条记录都含有相同信息;
- 删除异常:删除所有学生成绩,就把课程信息全删除了;
- 插入异常:学生未选课,无法记录进数据库;
- 更新异常:调整课程学分,所有行都调整。
正确的做法:
课程号 | 学分 |
---|
学号 | 姓名 |
---|
学号 | 课程号 |
---|
第三范式
消除非主属性对码的传递函数依赖
3NF对字段有冗余性对要求,任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖。
比如:
学号 | 姓名 | 年龄 | 学院 | 学院电话 |
---|
明显,学院电话是冗余,存在依赖传递关系学号->姓名->学院->学院电话
这里学院电话是直接依赖于学院,通过传递关系,间接的依赖于主键学号
可能会存在的问题:
- 数据冗余:有重复值;
- 更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 。
正确的做法:
学号 | 姓名 | 年龄 | 学院 |
---|
学院 | 学院电话 |
---|
区分第二范式和第三范式
第二范式是非主键对主键的部分依赖。也就是说主键有多个属性,但是非主键只依赖以其中的一部分,而不是全部。
第三范式是在第二范式的基础上,强调非主键必须直接依赖于主键,不能是传递关系。
部分转载自:https://www.yuque.com/fanzhengxu/tba6b8/dx0hvw