1.第一范式
确保每列保持原子性,第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
例如现在有一个学生表
学号 | 姓名 | 班级 |
---|---|---|
10000 | 张三 | 三年级一班 |
显然这里的班级和年级耦合在了一起
应当设计成
学号 | 姓名 | 年级 | 班级 |
---|---|---|---|
10000 | 张三 | 三年级 | 一班 |
2.第二范式
确保表中的每列都和主键相关,第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
例子如下
学号 | 考试编号 | 姓名 | 年级 | 班级 | 成绩 |
---|---|---|---|---|---|
10000 | 10001 | 张三 | 三年级 | 一班 | 610 |
10000 | 10002 | 张三 | 三年级 | 一班 | 600 |
应当拆成如下两表
学号 | 姓名 | 年级 | 班级 |
---|---|---|---|
10000 | 张三 | 三年级 | 一班 |
考试编号 | 学号 | 成绩 |
---|---|---|
10001 | 10000 | 610 |
10002 | 10000 | 620 |
3.第三范式
确保每列都和主键列直接相关,而不是间接相关,第三范式确保主键列之间没有传递函数依赖关系,也就是消除传递依赖
学号 | 姓名 | 年级 | 班级 | 年级主任 |
---|---|---|---|---|
10000 | 张三 | 三年级 | 一班 | 李四 |
改为
学号 | 姓名 | 年级 | 班级 |
---|---|---|---|
10000 | 张三 | 三年级 | 一班 |
年级 | 年级主任 |
---|---|
三年级 | 李四 |
4.总结
第二范式与第三范式的本质区别:在于有没有分出两张表。
必须先满足第一范式才能满足第二范式,必须同时满足第一第二范式才能满足第三范式。