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 一年三班