MySQL三范式

欢迎大家到我的博客浏览。MySQL三范式 | YinKai's Blog
简介

三大范式是 MySQL 数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。

三大范式之间是有依赖关系的,比如第二范式是在第一范式的基础上建设的,第三范式是在第二范式的基础上建设的。

简单来说,就是原子性、唯一性、无传递性。

第一范式 - 1NF

遵循原子性。即,表中字段的数据,不可再分。例如下述表结构:

员工编号 姓名 年龄
001 运营部小明 19
002 技术部小美 28
003 销售部小张 20

上述表结构中,姓名字段是可以进行再拆分的,因此它不符合第一范式。符合第一范式的表结构如下:

员工编号 部门 姓名 年龄
001 运营部 小明 19
002 技术部 小美 28
003 销售部 小张 20

但也并不是所有情况,都需要符合第一范式,例如:

员工编码 姓名
001 小张 江西省 南昌市 东湖区
002 小黄 广东省 佛山市 禅城区
003 小高 湖北省 武汉市 新洲区

所以,范式只是一个参考,更多的是需要根据实际情况设计表结构。

第二范式 - 2NF

在满足第一范式的情况下,遵循唯一性,消除部分依赖。即 表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。

通俗一点讲就是,一个表只能描述一件事情,且由该表的主键确定

例如,主键为学号,则可以确定姓名、年龄等学生信息。

学号 姓名 年龄
001 小美 18
002 小张 19
003 小明 20

主键为课程名称,就可以确定该课程学分、成绩等信息。

课程名称 成绩 学分
语文 90 3
数学 90 2
英语 90 3

不遵循第二范式,可能会造成下述后果:

  1. 数据冗余:将不同类型的信息存储在同一张表中可能导致数据冗余。例如,在学生表中,如果每个学生都有多个课程,将学生和课程信息合并存储可能导致数据复制。如果有两名学生,每人选修三门课程,表中会包含6条记录,其中的学生信息将重复。

  2. 更新数据不方便:当需要更新特定信息时,如果数据存储在同一张表中,更新可能变得不太方便。举例来说,如果需要更改某门课程的学分,必须在整个表中搜索相关记录并更新,这可能是一个繁琐的过程。但如果将数据拆分到不同的表中,只需在包含相关信息的表中进行更新,更加便捷。

  3. 插入数据不方便或可能导致异常情况:在某些情况下,插入数据可能变得复杂或引发异常。举例如下:

    • 假设主键是学号或课程名称,当需要插入新的课程信息时,必须精心规划哪些学生将选择该课程。这可能需要指定为哪些学生插入对应的课程信息。此外,如果还没有相关成绩信息,可能需要将成绩字段置为空,以后再进行更新。

    • 假设主键是学号和课程名称的联合主键,插入课程信息时,如果没有学生选择该课程,可能会导致学号主键字段缺失,从而无法插入相关信息。

第三范式 - 3NF

在满足第二范式的情况下, 消除传递依赖。即,在任一主键都可以确定所有非主键字段的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。

举个例子,如下

学号 姓名 班级 班主任
001 小美 一年级(3)班 陈老师

这个表中,学号是主键,它可以唯一确定姓名、班级、班主任,符合第二范式,但是在非主键字段中,我们可以可以通过班级推导出该班级的班主任,所以他不符合第三范式。

上述的表要满足第三范式,可以像下面这样设计:

1.学生表

学号 姓名 班级
001 小美 一年级(3)班

2.班级表

班级 班主任
一年级(3) 陈老师
通过把班主任和班级的映射关系做成另一张表,就可以消除表中的传递依赖。
总结
  • 第一范式(1 NF):字段不可再拆分

  • 第二范式(2 NF):表中任意一个主键或者任意一组联合主键,可以唯一确定除该主键外的所有非主键值。

  • 第三范式(3 NF):在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。

你可能感兴趣的:(MySQL,mysql,数据库,范式)