如何用数学方法判断指定关系模式分解是否保持依赖?
判断关系模式分解是否保持依赖的数学方法
一、保持依赖分解的核心定义
分解后的子模式对应函数依赖集的并集的闭包,与原函数依赖集F的闭包相等——换句话说,原F中的所有依赖都能通过分解后的子模式的依赖推导得出。实际判断时,只需验证F中的每个函数依赖X→Y,X关于分解后依赖的属性闭包都包含Y。
二、已知条件
- 原关系模式:
R = (A, B, C, D, E, H, I) - 原函数依赖集:
F = {A→B, C→D, CD→E, BD→AH, H→D, AC→H} - 分解后的子模式:
R₁=(A,B,C,D,I),R₂=(B,C,E,H)
三、步骤1:计算子模式上的投影依赖集
投影依赖集π_Ri(F)是原F的闭包中,所有属性都属于Ri的函数依赖:
- π_R₁(F)(仅包含A,B,C,D,I的依赖):
从F及其闭包中筛选,得到非平凡依赖:A→B、C→D、BD→A(由原依赖BD→AH推导得出BD→A,A属于R₁)。 - π_R₂(F)(仅包含B,C,E,H的依赖):
原F及闭包中无符合要求的非平凡依赖(所有原依赖的左部或右部包含R₂外的属性,如CD→E含D,AC→H含A等),仅存在平凡依赖(如X→X)。
分解后的总依赖集为:F₁∪F₂ = {A→B, C→D, BD→A} ∪ 平凡依赖。
四、步骤2:逐一验证原F中的依赖是否被保持
对每个X→Y∈F,计算X关于F₁∪F₂的属性闭包X⁺,判断Y是否完全包含于X⁺:
- A→B:
A⁺ = {A,B}(由F₁中的A→B推导),包含B,依赖被保持。 - C→D:
C⁺ = {C,D}(由F₁中的C→D推导),包含D,依赖被保持。 - CD→E:
CD⁺ = {C,D}(F₁中仅C→D,无其他可推导的属性),不包含E,依赖未被保持。 - BD→AH:
BD⁺ = {B,D,A}(由F₁中的BD→A、A→B推导),不包含H,依赖未被保持。 - H→D:
H⁺ = {H}(F₁∪F₂中无关于H的非平凡依赖),不包含D,依赖未被保持。 - AC→H:
AC⁺ = {A,B,C,D}(由F₁中的A→B、C→D推导),不包含H,依赖未被保持。
五、结论
该分解未保持原函数依赖集F中的多个依赖(CD→E、BD→AH、H→D、AC→H),因此不是保持依赖的分解。
内容的提问来源于stack exchange,提问作者Alan Costa Grey
相关产品推荐
相关产品推荐

