Mysql学习记录(二)三大范式

三大范式

第一范式(1NF)

每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。

举例:

学号 姓名 课程名称 分数
系名 系主任
1001 张无忌 经济系 张三丰 高等数学 95
1001 张无忌 经济系 张三丰 大学英语 33
1002 杨过 法学系 郭靖 大学英语 50

注意此时系的下面还可以分为系名和系主任,所以不符合第一范式。
修改后

表一 第一范式修改后
学号 姓名 系名 系主任 课程名称 分数
1001 张无忌 经济系 张三丰 高等数学 95
1001 张无忌 经济系 张三丰 大学英语 33
1002 杨过 法学系 郭靖 大学英语 50

此时仍旧存在的问题
1、存在非常严重的数据冗余(学号,姓名,系名,系主任)
2、数据添加存在问题,添加新开设的系和系主任时,数据不合法

学号 姓名 系名 系主任 课程名称 分数
1001 张无忌 经济系 张三丰 高等数学 95
1002 杨过 法学系 郭靖 大学英语 50
计算机系 殷天正

3、数据删除存在问题,当某人毕业,删除数据,会将系名系主任一并删除

学号 姓名 系名 系主任 课程名称 分数
1002 杨过 法学系 郭靖 大学英语 50

第二范式(2NF)

在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

函数依赖:A–> B ,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A
例如:学号–> 姓名 (学号,课程名称) --> 分数
完全函数依赖 : A --> B ,如果A是一个属性组,则B属性值的确定要依赖于A属性组中所有的属性值。
例如:(学号,课程名称)–> 分数
部分函数依赖: A --> B ,如果A是一个属性组,则B属性值的确定只依赖于A属性组中部分的属性值。
例如:(学号,课程名称)–> 姓名 只需学号即可确认姓名
传递函数依赖:A --> B , B --> C 如果通过A属性(属性组)的值,可以确定唯一B属性的值,再通过B属性(属性组)的值,可以确定唯一C属性的值,则称C传递函数依赖于A
例如:学号 --> 系名 系名 --> 系主任
:如果在一张表中,一个属性或者属性组,被其他所有属性所完全依赖,则称这个属性值(属性组)为该表的码
例如:该表中的码为:(学号,课程名称)通过这个属性组可以确定其他所有属性

  • 主属性:码属性(组)中的所有属性
  • 非主属性:除了码以外的属性

在上面表一的基础上修改
要去除冗余,需要分成两张表

表二 第二范式修改后的学生表
学号 姓名 系名 系主任
1001 张无忌 经济系 张三丰
1002 杨过 法学系 郭靖
表三 第二范式修改后的课程表
学号 课程名称 分数
1001 高等数学 95
1001 大学英语 33
1002 大学英语 50

目前存在的问题:
1、数据添加存在问题,添加新开设的系和系主任时,数据不合法
2、数据删除存在问题,当某人毕业,删除数据,会将系名系主任一并删除

第三范式(3NF)

在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

在表二、表三的基础上,目前仍旧存在传递依赖

学号 --> 系名 系名 --> 系主任

修改后

表四 第三范式修改后的学生表
学号 姓名 系名
1001 张无忌 经济系
1002 杨过 法学系
表三 第二范式修改后的课程表
学号 课程名称 分数
1001 高等数学 95
1001 大学英语 33
1002 大学英语 50
表五 第三范式修改后的系表
系名 系主任
经济系 张三丰
法学系 郭靖

目前删除和添加系名系主任可行,比如

表六 添加和删除操作的系表
系名 系主任
经济系 张三丰
法学系 郭靖
计算机系 殷天正

你可能感兴趣的:(Mysql)