三大范式
第一范式:要求每一个字段原子性不可再分
第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖
第三范式:所有非主键字段和主键字段之间不能产生传递依赖
第一范式(1NF)
要求每一个字段原子性不可再分
学号 | 姓名 | 性别 | 家长 | 手机号 |
---|---|---|---|---|
2018001 | 张三 | 男 | 张二,李梅 | 12222222223 |
2018002 | 李四 | 男 | 李三,姚月 | 12341255666 |
2018003 | 王五 | 男 | 王四,吴新 | 12344567788 |
家长这个字段里,包含了父亲和母亲,不符合第一范式的原子性,要把家长字段分成父亲和母亲2个字段
如下:
学号 | 姓名 | 性别 | 父亲 | 母亲 | 手机号 |
---|---|---|---|---|---|
2018001 | 张三 | 男 | 张二 | 李梅 | 12222222223 |
2018002 | 李四 | 男 | 李三 | 姚月 | 12341255666 |
2018003 | 王五 | 男 | 王四 | 吴新 | 12344567788 |
第二范式(2NF)
在第一范式的基础上,要求所有非主键字段完全依赖主键,不能产生部分依赖
学号和课程为联合主键
学号 | 姓名 | 课程 | 成绩 |
---|---|---|---|
2018001 | 张三 | java | 70 |
2018001 | 张三 | c++ | 66 |
2018002 | 李四 | java | 88 |
2018003 | 王五 | c++ | 85 |
张三(姓名)依赖于学号,张三(姓名)能依赖与课程嘛? 课程有很多个,不属于1对1关系,课程就不能作为张三(姓名)的主键,所以张三(姓名)只是部分依赖。不符合第二范式。
为了满足第二范式,要把这张表拆分为学生表,课程表和成绩表
学生表:
学号 | 姓名 |
---|---|
2018001 | 张三 |
2018002 | 李四 |
2018003 | 王五 |
课程表:
课程ID | 课程 |
---|---|
001 | java |
002 | c++ |
成绩表:
学号 | 课程ID | 成绩 |
---|---|---|
2018001 | 001 | 70 |
2018001 | 002 | 66 |
2018002 | 001 | 88 |
2018003 | 002 | 85 |
这里的 学号和课程ID属于联合主键, 学号和课程ID 对应 成绩,属于1对1关系,即每个人的课程只有一个成绩
第三范式(3NF)
在第二范式的基础上,所有的非主键字段跟主键字段之间不能产生传递依赖
即A(主键)-> B (非主键) ->C(非主键)
学号 | 姓名 | 寝室 | 寝室床位 |
---|---|---|---|
2018001 | 张三 | 001 | 6 |
2018002 | 李四 | 002 | 5 |
2018003 | 王五 | 001 | 6 |
在这里的学号跟寝室对应,寝室跟寝室床位对应,即学号跟寝室床位产生了传递依赖。
为了满足第三范式,把表分成 学生表和寝室表
学生表:
学号 | 姓名 | 寝室 |
---|---|---|
2018001 | 张三 | 001 |
2018002 | 李四 | 002 |
2018003 | 王五 | 001 |
寝室表:
寝室 | 寝室床位 |
---|---|
001 | 6 |
002 | 5 |
三大范式:
第一范式:要求每一个字段原子性不可再分
第二范式:要求所有非主键字段完全依赖主键,不能产生部分依赖
第三范式:所有非主键字段和主键字段之间不能产生传递依赖