数据库三大范式详解实例图文教程
需要用到的例表:
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. 具体实现
存在问题:
- 数据冗余:姓名,系名,系主任
- 添加新系时,数据不合法。
- 删除张三同学的数据时,系也删除了
3.1 转换为2NF,消除部分函数依赖,全为完全函数依赖
由前面所说:姓名,系名,系主任都完全依赖于学号,而分数完全依赖于学号和课程名称,将其分为两个表
化简:
现存问题:
1. 数据冗余,姓名,系名,系主任
2. 添加新系时,数据不合法。
3. 删除张三同学的数据时,系也删除了
3.2 转换为3NF,消除传递函数依赖
由前面所说,学号 --> 系名,系名 --> 系主任,再将其分为两个表,一共三个表
现存问题:
1. 数据冗余,姓名,系名,系主任
2. 添加新系时,数据不合法。
3. 删除张三同学的数据时,系也删除了
结尾:由此,问题全部解决,同时也由1NF转换为2NF,再转换为3NF