数据库三大范式
什么是范式
设计良好结构的数据库,可以有效减小数据冗余,减少增删改中出现的问题。深入理解数据库设计的三范式,对于设计“健壮的数据库“十分有必要,数据库三范式是设计数据库 时参考的准则。
第一范式(1NF):确保每一列的原子性:如果每一列都是不可再分的最小数据单元,则满足第一范式。
例如:
员工信息表:
工号 | 姓名 | 电话 |
001 | 张三 | 13700000001 |
002 | 李四 | 13700000002 |
这是一张简单的员工信息表,其中有工号、姓名、电话三个字段。通过电话这个字段获得的信息有可能是家庭电话,或是工作地点的电话,或是手机,因此表达的信息并不明确,我们可以改成这样:
工号 | 姓名 | 家庭电话 | 工作电话 | 手机 |
001 | 张三 | * | * | 13700000001 |
002 | 李四 | * | * | 13700000002 |
那这样改完以后,表中所表达的信息就非常明确了。
第二范式(2NF):在满足第一范式的基础上,非主键字段必须完全依赖于主键字段,而不能只依赖主键的一部分
部分依赖:当主键由两个或两个以上字段构成,而表中的某些信息通过主键的一个字段就能唯一确定,我们称这样的依赖关系为部分依赖。例如:
学生成绩表:
学生id | 课程id | 学生姓名 | 成绩 |
2018001 | 1001 | 野原新之助 | 80 |
该表由学生id和课程id共同组成主键,但表中的学生姓名可以根据学生id就能唯一确定,这就是部分依赖,这样的设计不符合第二范式。可以改成:
学生表:
学生id | 学生姓名 |
2018001 | 野原新之助 |
成绩表:
学生id | 课程id | 成绩 |
2018001 | 1001 | 80 |
第三范式(3NF):在满足第一范式的基础上,任何非主键字段不依赖于其它非主键字段
例如:
学生信息表:
学生id | 学院id | 学院名称 | 学生名字 |
2018001 | 120 | 物流学院 | 野原新之助 |
该表主键为学生id,而学院名称依赖于非主键字段学院id,所以不符合第三范式。可以改成:
学生表:
学生id | 学院id | 学生名字 |
2018001 | 120 | 野原新之助 |
学院表:
学院id | 学院名称 |
120 | 物流学院 |
最后:
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
=======================================
由于本人水平有限,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论哦。你也可以关注我,一起学习哦!