第六章逻辑结构设计小结
第六章逻辑结构设计小结
逻辑结构设计的要点: 将概念模型按一定规则转换成关系数据库模型, 它是一个过程。
涉及到的概念:
1. 函数依赖:完全函数依赖,部分函数依赖,传递函数依赖 2. 关系模式的规范化:范式,1NF,2NF,3NF,BCNF 3. 属性集合的闭包 4. 最小函数依赖集
具体的规范化过程:从 1NF 开始,通过模式分解,逐步消除非主属性 的部分函数依赖和传递函数依赖,达到 3NF,消除主属性的部分函数 依赖和传递函数依赖,达到 BCNF。
问题一:在概念设计阶段,我们也许会把所有可能的问题都想到了, 由此,就会生成许多的函数依赖,这些函数依赖是不是都是必需的, 抑或是只要从中挑选出一些,然后再由这些去推导出全部就行?
答:我们选择后者,因为我们需要最简洁的表述,即求取最小函数依 赖集 Fc. P128 其求取的步骤:p143 5 (1) 依次分解 F 中函数依赖的右侧属性为单属性;ABC==》AB ,AC (2) 消除 F 中冗余的函数依赖,只要证明消除该项函数依赖,不影响 结果即可(如何证明?) (3) 依次去消除 F 中函数依赖左侧的冗余属性。AC,ABC 以 P143 第 5 题第(1)为例,求解最小函数依赖集。 例:有关系模式 R(A,B,C,D,E),F 是 R 上的函数依赖集,求与 R 等价的 最小函数依赖集。
问题二:如何证明去掉某项函数依赖后,不影响结果? 答:对 XY,如果������ ∈ ������ + ������−{������→������} 成立,则表示可以消除。即,去掉该函 数依赖后,求得的属性 X 的闭包中仍旧包含了 Y,则该函数依赖可以 消除。 R(U,F)
问题三:什么是属性 X 的闭包?P124 答:X 是关于 F 的一个属性集,那么 X 的闭包就是记作������ + ������ ,X 的闭包 就是能由 X( 包含了 X 的子集 ) 函数确定的所有属性的集合。如: XB,XC, ������ + ������ =XBC P143 2 有 关 系 模 式 R(A,B,C,D,E,G,H), 其 函 数 依 赖 集 为
F={ABC,CAH,HCD,ACDB,DEG,BHC,CGBD,CEAG}, 求如பைடு நூலகம்下属性的闭包: (1) C+ 初始化 C+=C
∵CAH C+=CAH ∵HCD C+=CAHDBEG 整理一下:C+=ABCDEGH (2) (BD)+ 初始化(BD)+=BD ∵DEG (BD)+=BDEG (3) (EH)+ 初始化(EH)+=EH (4) (ACD)+ (5) 初始化(ACD)+=ACD (ACD)+=ACDHBEG
总结语:
有了候选码,就有了比较合理的函数依赖关系,水到渠成,可以进行 关系模式的设计,当设计好相应的关系模式(关系表)后,还需要对 它进行判断,若其规范化程度不高,会导致各种异常(插入异常,删 除异常等) ,就需要进一步地模式分解,一般达到 BCNF 范式的程度 就比较完美了。
有一个关系模式 R,有函数依赖{BCDEFG,ABH} L 类:B,AB
NLR 类:没有 LR:没有 B+=BCDEFGH (AB)+=ABHCDEFG 函数依赖{BCDEFG,ABH,ABB}
由于存在部分函数依赖,而 2NF 必须是消除了部分函数依赖 的范式,该关系达不到 2NF 的标准,因此无法达到 3NF 的标 准,所以 R 不是 3NF.
(项目经理,机器) 或者
(4)NLR 类:既不出现在左部,又不出现在右部的属性 2.在上述基础上,给出两个划分规则: 规则一:将 L 类和 NLR 类放入集合 K(K 就是目标集合) 规则二:R 类属性一定不能出现在候选码中 3.给出求解算法步骤: (1)将 L 类和 NLR 类放入集合 K; (2)求 K 的闭包 K+,若 K+=U(U 是所有属性的集合),则输出 K,算法结 束,否则转步骤(3) (3)依次将各个 LR 属性加入到集合 K,重复步骤(2) 由步骤(3)可以看出,候选码不唯一,也许有多个。
F={BCD,CE,BE,DE,DBC}
步骤 1:分解
F={BC,BD,BE,CE,DB,DC,DE}
步骤 2:消除冗余依赖
BC 求 B+=BDEC BD 求 B+=BE BE 求 B+=BDCE CE 求 C+=C DB 求 D+=DCE
DC 求 D+=DBE DE 求 D+=DBCE F={BD,CE,DB,DC} 步骤 3:因为 F 中所有函数依赖的左侧属性均为单个 属性,所以不存在冗余
(机器,工程号)
工程号项目经理,此函数依赖中没有包含以上任 意一个候选码,所以达不到 BCNF 的级别
问题四、求得了最小函数依赖集后还能做什么?
答:求解候选码(也就是说,修行码也可以有相应的求解规则,而不 是猜测得到的 )
问题五:如何求解候选码?
1.先将现有的函数依赖集中的属性分成四类:P127 (1)L 类:仅出现在函数依赖的左部属性。 (2)R 类:仅出现在函数依赖的右部属性。 (3)LR 类:既出现在左部,又出现在右部的属性