数据库范式学习
基本知识
超键 在关系型数据库中能够唯一标识一个元组的一个或者一组属性的集合,例如, 学生表中有学号、姓名、性别和身份证号四个字段,则学号、学号姓名、学号姓名性别、身份证号、身份证号学号等等都可以作为一个超键,因为它们都可以唯一确定表中的一个记录,超键可以有一个或多个;
候选键 不含有多余属性的超键,或者说最小属性的超键被称为候选键, 在超键中删去该属性组, 则无法唯一表示一个记录, 例如,学生表中的学号和身份证号是两个候选键, 任何包含这两个属性或者其中之一的元组删除候选键后,均无法唯一表示一个记录。例如, 学生表中一个超键, 学号姓名性别,若删除了学号这个候选键, 则仅仅有性别性别无法唯一确定一个学生表记录, 因为可能会有同名的学生, 而同样对于另一个超键学号姓名性别身份证号, 删去了学号和身份证号两个候选键也不成立, 也就是说超键中至少要包含一个候选键;
主键 在候选键集合中选择一个候选键作为主键, 主键可以唯一标识一个记录, 例如,学生表中可以选择学号或者身份证号作为主键;
外键 在关系型数据库中, 若P2是表T1的某个属性,同时P2是表T2的一个主键, 则称P2是T1的一个外键, 例如, 对学生表中添加一个属性专业代码, 则专业代码在学生表中只是一个属性, 但在专业表中, 专业代码是一个主键,外键描述了多个表之间的关系;
函数依赖 如果X和Y是关系R的两个属性集合,对于R中任意元组的X属性集合相同, 则它们的Y属性也相同,则称X函数决定Y或者Y函数依赖于X;
平凡函数依赖&&非平凡函数依赖 在函数依赖的基础上, 如果Y属性集合是X属性集合的子集合,则Y平凡函数依赖于X;若Y属性集合与X属性集合是R中互不相交的两个子集合, 则Y非平凡函数依赖于X;数据库系统中一般多研究非平凡函数依赖,因为显然一个属性集合的子集合一定平凡函数依赖于该属性集合;
完全函数依赖&&部分函数依赖 在函数依赖的基础上, 如果Y属性集合不函数依赖于X属性集合的任何一个真子集, 则称Y完全函数依赖于X,否则为Y部分函数依赖于X;
传递函数依赖 如果X、Y、Z是关系R中三个互不相同的子集合, 存在Y函数依赖与X,Z函数依赖与Y,但X不函数依赖于X,则称Z传递函数依赖于X。
第一范式
关系R中每一个属性都不可再分解, 也即每个属性都是原子性
学号 |
姓名 |
性别 |
10001 |
大雄 |
男 |
10002 |
静香 |
女 |
以上表符合第一范式,如果把姓名和性别放在一起或者学号身份证号放在一起, 则不符合第一范式
第二范式
在满足第一范式的基础上, 消除非主属性对于主属性的部分函数依赖即为第二范式
学号 |
姓名 |
性别 |
专业代码 |
辅导员 |
10001 |
大雄 |
男 |
01(汉语言文学) |
张伟 |
10002 |
静香 |
女 |
02(统计学) |
李明 |
这里不满足第二范式,因为学号和专业代码属性集合能够函数决定一个元组, 但其中辅导员只函数依赖于主属性中的专业代码属性
修改为两个表
学号 |
姓名 |
性别 |
专业代码 |
10001 |
大雄 |
男 |
01(汉语言文学) |
10002 |
静香 |
女 |
02(统计学) |
第三范式
在第二范式的基础上, 消除任何非主属性之间的传递函数依赖, 即任何非主属性不函数依赖于其他非主属性
学号 |
姓名 |
性别 |
辅导员工号 |
辅导员姓名 |
10001 |
大雄 |
男 |
4001 |
张伟 |
10002 |
静香 |
女 |
4002 |
李明 |
这里的主属性是学号, 其他属性都可以由主属性所确定, 但非主属性中辅导员工号能够确定辅导员的姓名, 并且辅导员工号无法确定学生学号, 则满足第二范式确不满足第三范式
修改为两个表
学号 |
姓名 |
性别 |
辅导员工号 |
10001 |
大雄 |
男 |
4001 |
10002 |
静香 |
女 |
4002 |
辅导员工号 |
辅导员姓名 |
4001 |
张三 |
4002 |
李四 |
BC范式
如果一个关系模式满足所有非主属性对每一个码是完全函数依赖,所有主属性对每一个不包含它的码也是完全函数依赖,没有任何属性完全依赖于非码的任何属性, 则称关系满足BC范式,即BC范式排除了任何属性对主属性的部分依赖与传递依赖, 而第二和第三范式只是针对非主属性
学号 |
专业代码 |
导师工号 |
10001(大雄) |
01 |
6001(张伟) |
10002(静香) |
02 |
6010(李明) |
1003(小夫) |
01 |
6001(张伟) |
1004(胖虎) |
01 |
6002(王二麻子) |
1005(哆啦a梦) |
02 |
6011(二愣子) |
这里学号和专业代码作为主属性决定一个记录, 导师工号也由主属性唯一确定, 因为一个专业有很多导师,一个导师只是教授一个专业的一部分学生, 但是非主属性的导师工号能够决定所在教学的专业,所以不满足BCNF范式,部分主属性依赖于非主属性
修改为两张表
学号 |
专业代码 |
10001(大雄) |
01 |
10002(静香) |
02 |
1003(小夫) |
01 |
1004(胖虎) |
01 |
1005(哆啦a梦) |
02 |
导师工号 |
专业代码 |
6001 |
张伟 |
6002(王二麻子) |
01 |
6010(李明) |
02 |
6011(二愣子) |
02 |
第四范式
BCNF范式消除了任何由于函数依赖导致的异常,第四范式在此基础上要消除多值依赖
课程号 |
老师工号 |
书本名 |
01(古代文学) |
6001(张伟) |
北师大版古代文学 |
02(统计学方法) |
6010(李明) |
北大版统计学方法 |
01(古代文学) |
6001(张伟) |
华师大版古代文学 |
02(统计学方法) |
6011(二愣子) |
南大版统计学方法 |
01(古代文学) |
6002(王二麻子) |
南师版古代文学 |
所有属性构成了主属性,即该表只有主键,没有其它字段了,但存在多值依赖。
多值依赖 一种关系,至少存在三个属性(A、B、C),才能存在这种关系。对于每一个A值,有一组确定的B值和C值,并且这组B的值独立于这组C的值。若为统计学方法课程选择一本国外统计学方法的书籍但没有老师教授则无法维护课程和书籍之间的关系
修改为两张表
课程号 |
老师工号 |
01(古代文学) |
6001(张伟) |
02(统计学方法) |
6010(李明) |
01(古代文学) |
6001(张伟) |
02(统计学方法) |
6011(二愣子) |
01(古代文学) |
6002(王二麻子) |
课程号 |
书本名 |
01(古代文学) |
北师大版古代文学 |
02(统计学方法) |
北大版统计学方法 |
01(古代文学) |
华师大版古代文学 |
02(统计学方法) |
南大版统计学方法 |
01(古代文学) |
南师版古代文学 |
02(统计学方法) |
普林斯顿版统计学方法 |