函数依赖
函数Y=f(x):给定一个x值,都会有一个y值与之对应
关系数据库中讨论函数依赖更注重语义上的关系:
省=f(城市)
关于平凡函数依赖与非平凡函数依赖
完全函数依赖与部分函数依赖
传递依赖
有关系模式:学生(学号,姓名,性别,身份证号,年龄,所在系)
- 候选码:学号,身份证号
- 主码:学号或身份证号
- 主属性:学号,身份证号
- 非主属性:姓名,性别,年龄,所在系
例子:教师_课程(教师号,课程号,授课学年)找出候选码
语义:一个教师在一个学年可以讲授多门课程,而且一门课程在一个学年也可以由多个教师讲授,同一个学年可以开设多门课程
候选码(教师号,课程号,授课学年)全码表
第二范式
分解办法:
- 首先,对于组成主码的属性集合的每一个子集,用它作为主码构成一个表
- 然后,将完全函数依赖于这些主码的属性放置到相应的表中
- 最后,去掉只由主码的真子集构成的表
S_L_C(Sno,Sname,Ssex,Sdept,Sloc,Cno,Grade)
Sno->Sname,Sno->Ssex,Sno->Sdept,Sno->Sloc,(Sno,Cno)->Grade,Sdept->Sloc
码(Sno,Cno)因为存在(Sno,Cno)->Sdept等多个部分函数依赖,所以不是2NF
- 分解表
S-L(Sno,Sloc…)
C(Cno,…)
S-C(Sno,Cno…) - 将完全函数依赖于这些主码的属性放置到相应表中
S-L(Sno,Sname,Ssex,Sdept,Sloc)
C(Cno)
S-C(Sno,Cno,Grade) - 最后,去掉只由主码的真子集构成的表,最终分解为
S-L(Sno,Sname,Ssex,Sdept,Sloc)
S-C(Sno,Cno,Grade)
注意,去掉只由主码的真子集构成的表