三大范式的通俗解释
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
其中最常使用的是第一范式(1NF)、第二范式(2NF)、第三范式(3NF),也就是所谓的三大范式
第一范式
第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。
1NF是对属性的**原子性
**,要求属性具有原子性,不可再分解
举例说明:
部门 | 姓名 | 家庭信息 |
---|---|---|
001-前端 | 张三 | 江苏-未婚 |
002-后端 | 李四 | 浙江-已婚 |
003-策划 | 王五 | 重庆-已婚 |
在此表中,可发现“部门”列和“家庭信息”列不满足原子性的要求,故不满足第一范式,调整如下:
部门编号 | 部门名称 | 姓名 | 户籍 | 是否婚配 |
---|---|---|---|---|
001 | 前端 | 张三 | 江苏 | 未婚 |
002 | 后端 | 李四 | 浙江 | 已婚 |
003 | 策划 | 王五 | 重庆 | 已婚 |
可见,调整后的每一列都是不可再分的,因此满足第一范式(1NF)
第二范式
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
2NF是对记录的**唯一性
,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖**
举例说明:
学号 | 姓名 | 课程号 | 年龄 | 学分 |
---|---|---|---|---|
001 | 张三 | 101 | 18 | 3 |
002 | 李四 | 103 | 17 | 2 |
003 | 王五 | 102 | 19 | 3 |
上表明显说明了两个事物:“学生信息”与“课程信息”。由于非主键字段必须依赖主键,这里学分依赖的是课程号,姓名与年龄依赖的是学号,所以不符合二范式,调整如下:
学生信息表:
学号 | 姓名 | 年龄 |
---|---|---|
001 | 张三 | 18 |
002 | 李四 | 17 |
003 | 王五 | 19 |
课程信息表:
课程号 | 学分 |
---|---|
101 | 3 |
103 | 2 |
102 | 3 |
也就是说,第二范式(2NF)就是要求一张表只讲一件事。
第三范式
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
3NF是对字段的**冗余性
,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖**
举例说明:
学号 | 姓名 | 年龄 | 学院名称 | 学院电话 |
---|---|---|---|---|
001 | 张三 | 18 | 理工 | 123 |
002 | 李四 | 17 | 建工 | 456 |
003 | 王五 | 19 | 人文 | 789 |
从上表可知,所有属性都完全依赖于“学号”,所以满足2NF。但**“学院电话”是直接依赖“学院名称”**的,而不是主键“学号”,所以调整如下:
学生表:
学号 | 姓名 | 年龄 |
---|---|---|
001 | 张三 | 18 |
002 | 李四 | 17 |
003 | 王五 | 19 |
学院表:
学院名称 | 学院电话 |
---|---|
理工 | 123 |
建工 | 456 |
人文 | 789 |