一、将非第二范式分解成第二范式
前记:非第二范式-存在非主属性对主键的部分函数依赖。
- 分解步骤
1、用组成主键的属性集合的每一个子集作为主键构成一个新的关系模式。
2、将依赖于这些主键的属性放置到相应的新的关系模式中。
3、最后去掉只由主键的子集构成的关系模式。
例如:关系(Sno, Sname, Ssex, Sdept, Sloc, Cno, Grade)
对应:(学号,姓名,性别,所在系,宿舍楼号,课程号,成绩)
分析:因为该关系模式的主键是(Sno,Cno),并且有Sno->Sname,因此Sname部分函数依赖于(Sno,Cno),所以,该关系不满足第二范式。
解:将该关系模式分解为如下三个关系模式(**部分表示主键)
(**Sno**, Sname, Ssex, Sdept, Sloc)
(**Cno**) //去掉
(**Sno, Cno**, Grade)
最后,得到了两个满足第二范式的关系。
二、将非第三范式分解成第三范式
前记:非第三范式-存在非主属性对主键的传递函数依赖。
- 分解步骤
1、对于不是候选键的每个决定因子(依赖关系中左边的部分),从关系模式中删去依赖于它的所有属性。
2、新建一个关系模式,新关系模式中包含原关系模式中所有依赖于该决定因子的属性。
3、将决定因子作为新关系模式的主键。
例如:(Sno, Sname, Ssex, Sdept, Sloc)中,Sdept不是候选键,但是Sdept->Sloc。所以,Sdept是决定因子,从关系中删去依赖它的Sloc。
新建一个关系模式(**Sdept**, Sloc)。
最后关系模式(Sno, Sname, Ssex, Sdept, Sloc, Cno, Grade)被分解为三个满足第二、三范式的关系模式:
(Sno, Sname, Ssex, Sdept)
(**Sdept**, Sloc)
(**Sno,Cno**, Grade)