这是我参与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 一年三班