MySQL学习笔记(十七)

154 阅读4分钟

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

10.1 第一范式

  • 第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式1NF中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列 [1]  。
  • 地位:最核心、最重要的范式,所有表的设计都需要满足
  • 要求:必须有主键,并且每一个字段原子性不可再分
 【案例】:判断是否满足第一范式
 ​
 学生编号    学生姓名    联系方式
 -------------------------------------
 1001        张三      zs@gmail.com,1359999999
 1002        李四      ls@gmail.com,13699999999
 1001        王五      ww@163.net,13488888888
 ​
 【存在问题】:
 1、最后一条记录和第一条重复(不唯一,没有主键)
 2、联系方式字段可以再分,不是原子性的
 ​
 【更改】:
 学生编号(pk)    学生姓名    email           联系电话
 -------------------------------------------------------------
     1001        张三      zs@gmail.com    1359999999
     1002        李四      ls@gmail.com    13699999999
     1003        王五      ww@163.net      13488888888

10.2 第二范式

  • 要求:建立在第一范式之上,要求所有非主键字段完全依赖主键,不要产生部分依赖
  • 多对多三张表,关系表两个外键
 【案例】:判断是否满足第一范式
 
 学生编号 学生姓名 教师编号 教师姓名
 1001 张三 001 王老师
 1002 李四 002 赵老师
 1003 王五 001 王老师
 1001 张三 002 赵老师
 确定主键:
 学生编号(PK) 教师编号(PK) 学生姓名 教师姓名
 1001 001 张三 王老师
 1002 002 李四 赵老师
 1003 001 王五 王老师
 1001 002 张三 赵老师
 
 /**以上虽然确定了主键,但此表会出现大量的冗余,主要涉及到的冗余字段为“学生姓名”和“教师姓名”,出现冗余的
 原因在于,学生姓名部分依赖了主键的一个字段学生编号,而没有依赖教师编号,而教师姓名部门依赖了主键的一个
 字段教师编号,这就是第二范式部分依赖。***/
 
 解决方案如下:
 
 学生信息表
 学生编号( PK) 学生姓名89 / 103
 1001                张三
 1002                李四
 1003                王五
 
 教师信息表
 教师编号( PK)   教师姓名
 001             王老师
 002             赵老师
 
 教师和学生的关系表
 学生编号(PK) fk学生表的学生编号 教师编号(PK) fk教师表的教师编号
         1001                        001
         1002                        002
         1003                        001
         1001                        002
 /*如果一个表是单一主键,那么它就复合第二范式,部分依赖和主键有关系
 以上是一种典型的“多对多”的设计*/

10.3 第三范式

  • 要求:建立在第二范式之上,要求所有非主键字段直接依赖主键,不要产生传递依赖
 【案例】:判断是否满足第三范式
 
 学生编号( PK) 学生姓名 班级编号 班级名称
 1001 张三 01 一年一班
 1002 李四 02 一年二班
 1003 王五 03 一年三班
 1004 赵六 03 一年三班
 
 /*从上表可以看出,班级名称字段存在冗余,因为班级名称字段没有直接依赖于主键,班级名称字段依赖于班级编号,
 班级编号依赖于学生编号,那么这就是传递依赖,解决的办法是将冗余字段单独拿出来建立表,如:*/
 
 学生信息表
 学生编号( PK) 学生姓名 班级编号( FK)
 1001 张三 01
 1002 李四 02
 1003 王五 03
 1004 赵六 03
 
 班级信息表
 班级编号( PK) 班级名称
 01 一年一班
 02 一年二班
 03 一年三班