范式
数据库设计时常需要使用第一到第三范式,三种范式的描述如下:
第一范式(1NF)
满足条件
- 原子性,数据库中的字段是不可分割的。(一个字段只存储一项信息)
示例
反例
学号 | 姓名 | 班级 |
---|---|---|
0001 | 小红 | 高三年级1班 |
正例
学号 | 姓名 | 年级 | 班级 |
---|---|---|---|
0001 | 小红 | 高三年级 | 1班 |
反例中班级字段:高三年1班,包含两项信息:年级、班级,不符合第一范式。
第二范式(2NF)
满足条件
- 原子性,数据库中的字段是不可分割的。(一个字段只存储一项信息)
- 表中必须有主键
- 非主键必须完全依赖主键,不能只依赖主键一部分。
示例
反例
学号 | 学生姓名 | 课程号 | 课程名 | 成绩 |
---|
正例
学号 | 课程号 | 成绩 |
---|
反例中存在两个主键:学号、课程号,根据学号确定学生姓名,根据课程号确定课程名,学生姓名和课程名都只依赖了其中一个主键(学号、课程号),只有成绩才是根据学号、课程号唯一确定的。
第三范式(3NF)
满足条件
- 原子性,数据库中的字段是不可分割的。(一个字段只存储一项信息)
- 表中必须有主键
- 非主键字段必须完全依赖主键,不能只依赖主键一部分。
- 非主键字段完全直接依赖主键,不能是传递依赖。
示例
反例
学号 | 姓名 | 年龄 | 年级 | 学院 | 学院地址 |
---|
正例
学号 | 姓名 | 年龄 | 年级 | 学院 |
---|
学院依赖于主键学号,但是学院地址依赖于学院,这样对主键就是不是直接依赖,存在传递依赖。