Ø 关系模式的分解是关系模式规范化的本质问题,其目的是实现概念的单一化,即使得一个关系仅描述一个概念或概念间的一个种联系。通过分解可以将一个关系模式分成多个满足更高要求的关系模式,这些关系模式可以在一定程度上解决或缓解数据冗余、更新异常、插入异常、删除异常等问题。
Ø 关系模式分解实际上又是一个关系模式的属性投影和属性重组的过程,又称投影分解。投影和重组的基本指导思想是逐步消除数据依赖中不适合的成分,结果将产生多个属于更高级别范式的关系模式。
u 投影分解的步骤就是低级范式到高级范式转化的步骤,具体步骤是:
Ø 基于消除关系模式中非主属性对候选码的函数依赖的原则,对1NF关系模式进行合理的投影(属性重组),结果将产生多个2NF关系模式。
Ø 基于消除关系模式中非主属性对候选码的传递函数依赖的原则,对2NF关系模式进行合理的投影,结果将产生多个3NF关系模式。
Ø 基于消除关系模式中主属性对候选码的传递函数依赖的原则,对3NF关系模式进行合理的投影,结果将产生多个BCNF关系模式。
2.6.2 关系模式的分解
• 连接无损分解
定义2.12 假设一个关系模式R(U)被分解成n个子关系模式:R1(U1),R2(U2),…, Rn(Un),其中U = R1(U1)∪R2(U2)∪…∪Rn(Un),并假设r, r1, r2,…, rn分别属于关系模式R(U)及n个子关系模式的关系(二维表),如果这n个子关系的自然连接与原关系r相等,即r = r1 ⋈ r2 ⋈ … ⋈ rn,那么这种分解称为(自然)连接无损分解,其中ri是r在Ui上的投影, i = 1,2,…n。
Ø 分解的基本思想之一是消除对候选码的部分函数依赖和传递函数依赖。我们可以先在待分解的关系模式中找出这些部分函数依赖和传递函数依赖以及完全函数依赖,然后“分解”部分函数依赖和传递函数依赖,使得这些函数依赖最终都变成完全函数依赖,最后将这些完全函数依赖所涉及的属性分别投影成新的关系即可。
【例2.14】对于例2.6中的关系模式SSC(学号, 姓名, 系别, 导师工号, 导师姓名, 导师职称, 课程名称, 课程成绩),请运用模式分解方法将其转化为若干个属于BC范式的关系模式。
Ø 关系模式SSC中唯一的候选码为{学号, 课程名称}。我们先找出对候选码的所有完全函数依赖、部分函数依赖和传递函数依赖:
• {学号, 课程名称} 课程成绩
• {学号, 课程名称} {姓名, 系别}
• {学号, 课程名称} 导师工号
• 导师工号 {导师姓名, 导师职称}
• {学号, 课程名称} {导师姓名, 导师职称}
u 以下找出部分函数依赖中的完全函数依赖:
由“{学号, 课程名称} {姓名, 系别}”得到“学号 {姓名, 系别}”
由“{学号, 课程名称} 导师工号 ”得到“学号 导师工号”
u 我们根据以上所有的完全函数依赖初步设定分解成的各关系模式(原则是“一个完全函数依即为一个关系模式”):
Ø T1(学号, 课程名称, 课程成绩)
Ø T2(导师工号, 导师姓名, 导师职称)
Ø T3(学号, 姓名, 系别)
Ø T4(学号, 导师工号)
u 为了减少数据冗余和减少数据维护的复杂性,可以将关系模式T4(学号, 导师工号)并到T3(学号, 姓名, 系别)中,从而形成新的关系模式——T3′(学号, 姓名, 系别, 导师工号)。这样,就得到如下的分解结果:
Ø T1(学号, 课程名称, 课程成绩)
Ø T2(导师工号, 导师姓名, 导师职称)
Ø T3′(学号, 姓名, 系别, 导师工号)
u 由定理2.3稍加分析可以知道,以上三个关系模式均属于BC范式,而且上述的分解是连接无损分解。