你知道 MySQL 的三大范式吗?

oYto · · 45836 次点击 · 开始浏览    置顶

> 欢迎大家到我的博客浏览 <a color="red" href="https://www.yinkai.cc/post/6209a41d0c1bdc89b8242b6c5a89a469">YinKai 's Blog | MySQL 三大范式</a> #### 简介<!--more--> ​ 三大范式是 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。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

45836 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传