三大范式
第一范式(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 |
系名 | 系主任 |
---|---|
经济系 | 张三丰 |
法学系 | 郭靖 |
目前删除和添加系名系主任可行,比如
系名 | 系主任 |
---|---|
经济系 | 张三丰 |
法学系 | 郭靖 |
计算机系 | 殷天正 |