第一范式(1NF)
每列的原子性,表中的每一个字段都是不可分割的,同一列中不能有多个值。第一范式是对关系模式的基本要求,不满足第一范式的数据库不是关系型数据库。
- 不满足第一范式的示例:
学生编号 |
学生姓名 |
联系方式 |
1001 |
张三 |
zs@gmai1.com,1359999999 |
1002 |
李四 |
1s@gmai1.com,13699999999 |
1003 |
王五 |
ww@163.net ,13488888888 |
注意: 第一范式要根据实际需求来定
考虑地址字段(黑龙江省哈尔滨市南港区征仪路 156号)是否符合第一范式,如果经常访问地址中的城市部分就不符合第一范式需要对地址进行拆分。如果不会访问拆分的部分,就符合第一范式,拆分反而不利于查询完整地址。
第二范式(2NF)
确保唯一性和依赖性,每个表都有主键,且其他字段完全依赖主键。
第二范式是在第一范式的基础上,要求表中的每一条数据可以被唯一区分,通常使用主键实现,其他所有字段都完全依赖主键。
其他字段依赖主键是指,其他每个字段都与主键完全相关,当确定主键的值时就能确定其他所有字段的值。也就是说一个表只能存一种数据,不可以把多种数据存到一个表中。
完全依赖是指,联合主键时,其他字段不可以只依赖主键中的某个字段,必须依赖联合主键中的每一个字段。
- 不满足第二范式的示例:
学生编号 |
课程编号 |
学生姓名 |
成绩 |
1001 |
001 |
张三 |
90 |
1002 |
001 |
李四 |
80 |
1003 |
002 |
王五 |
90 |
第三范式(3NF)
在第二范式的基础上,非主键字段必须直接依赖于主键,不能存在传递依赖。
- 不满足第三范式的示例:
学生编号 |
班级编号 |
学生姓名 |
班级名 |
1001 |
01 |
张三 |
一年一班 |
1002 |
02 |
李四 |
一年二班 |
1003 |
03 |
王五 |
一年三班 |
范式总结
- 1NF:每列原子性,字段不可分割
- 2NF:唯一性和依赖性,要有主键,且其他字段完全依赖主键
- 3NF:没有传递依赖
范式的优缺点:
- 优点:
- 重复数据很少或者没有
- 表更小,可以更好的放在内存里,执行操作更快o更新操作更快
- 可以更少使用group by 和distinct
- 缺点: 复杂一点的查询需要关联,可能使索引无效