MySQL三范式与反三范式
MySQL三范式与反范式
(参考CS-NOTES : http://www.cyc2018.xyz/数据库/数据库系统原理.html#范式)
三范式基本内容
第一范式(1NF)
属性不可再分;
即表中的字段不能再拆分
例: 一个Name属性可以分为FirstName属性和LastName属性,则不符合第一范式。
第二范式(2NF)
表中有键码,非主属性完全依赖键码;
即表中的非主属性完全依赖于键码,可以根据键码去获取。
例:
Sno | Sname | Sdept | Mname | Cname | Grade |
---|---|---|---|---|---|
1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 |
2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 |
2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 |
3 | 学生-3 | 学院-2 | 院长-2 | 课程-2 | 95 |
以上学生课程关系中,{Sno, Cname} 为键码,有如下依赖关系:
- Sno -> Sname, Sdept
- Sdept -> Mname
- Sno, Cname-> Grade(只有Grade完全依赖键码)
可以分解为
表1
Sno | Sname | Sdept | Mname |
---|---|---|---|
1 | 学生-1 | 学院-1 | 院长-1 |
2 | 学生-2 | 学院-2 | 院长-2 |
3 | 学生-3 | 学院-2 | 院长-2 |
有以下函数依赖:
-
Sno -> Sname, Sdept
-
Sdept -> Mname
表2
Sno | Cname | Grade |
---|---|---|
1 | 课程-1 | 90 |
2 | 课程-2 | 80 |
2 | 课程-1 | 100 |
3 | 课程-2 | 95 |
有以下函数依赖:
- Sno, Cname -> Grade
第三范式(3NF)
非主键字段不能相互依赖;
即非主键字段与主键不能存在传递依赖。
例:表1中Sno -> Sdept -> Mname,存在传递依赖;
可以分解为表2和表3将依赖分解为Sno -> Sdept和Sdept -> Mname。
(表1)
Sno | Sname | Sdept | Mname |
---|---|---|---|
1 | 学生-1 | 学院-1 | 院长-1 |
2 | 学生-2 | 学院-2 | 院长-2 |
3 | 学生-3 | 学院-2 | 院长-2 |
(表2)
Sno | Sname | Sdept |
---|---|---|
1 | 学生-1 | 学院-1 |
2 | 学生-2 | 学院-2 |
3 | 学生-3 | 学院-2 |
(表3)
Sdept | Mname |
---|---|
学院-1 | 院长-1 |
学院-2 | 院长-2 |
反三范式
反三范式的理由
- 三范式优缺点
优点:
减少数据冗余
范式化的更新操作比反范式化更快
范式化的表比反范式化的表更小
缺点:
- 查询经常需要关联多个表
- 难以进行索引优化
- 反三范式优缺点
优点:
- 可以减少表的关联
- 可以设计有效的索引,便于索引优化
缺点:
- 存在较多冗余数据
- 修改数据的维护成本较高
对于三范式和反三范式的选择
在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。
博客里的内容都是平时的学习笔记,如有错误,欢迎各位大佬指出!!!