数据库三大范式详解实例图文教程

需要用到的例表:
在这里插入图片描述

1. 名词概念

1.1 函数依赖

A --> B,如果通过A属性(属性组)的值,可以确定唯一属性B的值,则称属性B依赖于A

如:学号 --> 姓名 (学号唯一确定姓名)                      1001 --> 张三
(学号,课程名称)--> 分数 (学号和课程名称唯一确定分数) (1001,Java) --> 89

1.2 完全函数依赖

A --> B,如果A是一个属性组,则B属性确定需要依赖于A属性组中的所有属性值

如:(学号,课程名称)--> 分数 (分数需要完全依赖于学号和课程才能得出)

1.3 部分函数依赖

A -- > B,如果A是一个属性组,那么B属性只需要依赖A属性组中的一些值即可

如:(学号,课程名称)--> 姓名

1.4 传递函数依赖

A --> B,B --> C,则A --> C。通过A属性(属性组)的值,可以确定唯一B属性的值,通过B属性的值,可以确定唯一的C属性的值,则称 C 传递依赖于 A

如:学号 --> 系名,系名 --> 系主任,则学号 --> 系主任(通过学号,可以确定唯一的系主任)

1.5 码

在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码

如:该表的码为:(学号,课程名称)
其中,姓名,系名,系主任,都完全依赖于学号,而分数则完全依赖于(学号,课程名称)。(学号,课程名称)被其他所有属性所完全依赖,即为该表的码

2. 三大范式概念简述

第一范式(1NF):每一列都是不可分割的原子数据项
第二范式(2NF):在满足第一范式的前提下,表中的每一个字段都完全依赖于主键。即在1NF的基础上,消除非主属性对主码的部分函数依赖,非码属性必须完全依赖于码属性
第三范式(3NF):在满足第二范式的前提下,表中的每一列都直接依赖于主键,而不是通过其他的列来间接依赖主键。即不得传递依赖于主键,在2NF基础上,消除传递依赖

3. 具体实现

在这里插入图片描述
存在问题:

  1. 数据冗余:姓名,系名,系主任
  2. 添加新系时,数据不合法。
  3. 删除张三同学的数据时,系也删除了

3.1 转换为2NF,消除部分函数依赖,全为完全函数依赖

由前面所说:姓名,系名,系主任都完全依赖于学号,而分数完全依赖于学号和课程名称,将其分为两个表

在这里插入图片描述
化简:
在这里插入图片描述
现存问题:
1. 数据冗余,姓名,系名,系主任
2. 添加新系时,数据不合法。
3. 删除张三同学的数据时,系也删除了

3.2 转换为3NF,消除传递函数依赖

由前面所说,学号 --> 系名,系名 --> 系主任,再将其分为两个表,一共三个表

在这里插入图片描述
现存问题:
1. 数据冗余,姓名,系名,系主任
2. 添加新系时,数据不合法。
3. 删除张三同学的数据时,系也删除了

结尾:由此,问题全部解决,同时也由1NF转换为2NF,再转换为3NF

posted @ 2022-12-21 14:42  凡223  阅读(30)  评论(0编辑  收藏  举报