范式简介:
MySQL中的三大范式是数据库设计的基本原则,旨在减少数据冗余、提高数据一致性和完整性。
第一范式:
第一范式要求数据库表的每一列都是不可分割的基本数据项,确保每一列都具有原子性。
在关系型数据库的设计中,满足第一范式是对关系模式的基本要求。不满足第一范式的数据库就不能被称为关系型数据库
反例:

正例:

第二范式:
第二范式在满足第一范式的基础上,要求非主键字段必须完全依赖于主键,而不是部分依赖。
反例:

不满足第二范式时可能出现的问题:
- 数据冗余:一个学生参加了多名考试,姓名、年龄、性别等就会在每行记录中重复出现
- 更新异常:如果需要调整学分,就要更新表中所有关于学分的记录,一旦执行中断到时更新失败就会出现数据不一致问题
- 插入异常:如果有一个新课还没有学生参加考试取得成绩,那么新课在数据库中是不存在的,因为成绩为空没有意义
- 删除异常:当学生毕业时需要删除考试数据,就有可能删除某一课程和学分,导致数据库里没有某一课程和学分的信息
当我们要做一个学生考试成绩表时,要先明确一点,我们要记录的是某个学生参加了某门考试之后得到的分数。
- 候选键:可以唯一标识一行数据的列或列的组合,可以从候选键中选一个或多个当做表的主键
像上图中的表,我们以学号为主键,其余列就为候选键;
在这个表中用学号作为这个表的主键来表示一个学生信息,那么姓名、年龄、性别都是学生信息中的一部分,所以这些列对于主键就是完全依赖 。学分、成绩并不和学生信息直接相关,所以是**部分依赖。**如果我们要让上表满足第二范式通常需要将部分依赖的字段拆分到新表中。
正例:

把 学生ID 和 课程ID 作为一个复合主键,值用来记录成绩,没有部分函数依赖,也就非常的高效
第三范式:
第三范式在满足第二范式的基础上,要求非主键字段之间不能存在传递依赖
反例:

在这个表中,用ID、学号、姓名、年龄来表示一个学生的信息,学院名、学院电话等都是关于学院的信息,同时也是这个学生的学生的信息,但是学院名等数据与学生信息一起存储时就会发生冗余,这里这样的关系就称作传递依赖
正例:

实际应用建议:
- 范式并非绝对标准,需根据实际场景权衡。过度范式化可能导致查询性能下降。
- 反范式设计(如适当冗余)常用于数据仓库或高频查询场景以提高性能。