博客
关于我
数据库模式分解----如何判断保持无损连接性和保持函数依赖
阅读量:500 次
发布时间:2019-03-07

本文共 2121 字,大约阅读时间需要 7 分钟。

好吧,让我来看看这个算法是怎么回事。书上的内容确实有点抽象,对吧?那我们就慢慢理清思路,看看这个属性集的闭包到底是怎么回事。

首先,属性集的闭包,也就是α+。简单来说,就是从一个属性集α出发,通过已知的函数依赖关系F,可以直接或间接地推导出哪些其他属性。比如,假设我们有一个关系模式R,属性集U={A,B,C,D,E},函数依赖集F={A→B, B→C, D→E}。如果我们选择α={A,E},那么根据F,我们可以从A推导出B,然后从B推导出C。同时,D直接可以推导出E。因此,关闭后,α+={A,B,C,E}。

好的,理解了属性集的闭包那么接下来,我们来看看无损连接性的判断。系统会分解关系集合ρ为多个关系,然后逐个检查这些关系之间是否有无损连接。具体来说,当分解的关系集合ρ只有两组时,如果R1∩R2可以推导出R1-R2或者R2-R1,那么这两种情况中只要有一个满足,就意味着这两部分之间是无损连接的。如果两者都不满足,那就意味着连接是有损的。

举个例子,假设有一个关系模式R(U,V,W,X,Y,Z),函数依赖集F={U→V, W→Z, Y→U, WY→X},分解ρ={UVY, WXYZ}。那么,首先分解后的UVY和WXYZ这两个关系,在进行R1∩R2的时候,会得到Y。接下来,R1-R2会得到UV,而R2-R1会得到WXZ。也就是说,这两种差集分别是从UVY和WXYZ中去除了共同元素Y得到的结果。

那么问题来了:为什么要证明Y→UV或者Y→WXZ至少有一个成立呢?实际上,根据F={U→V, Y→U},可以推导出Y→U,然后U→V,因此我们有Y→UV。这就意味着Y可以推导出UV,而Y是否能推出WXZ则不一定。由于Y→UV成立,所以这就足以证明整个分解ρ是无损连接的。

当分解的关系集合ρ超过两组时,情况就复杂一些。我们需要使用一种称为“初始判断表”的方法来判断是否存在无损连接。首先,我们需要构建一个初始判断表,表格中的每一行对应一个关系,对应的每一列则代表分解后的各个生成关系。这时候,我们需要按照以下规则进行表格的修改:

  • 找到F中对应的函数依赖列的相同项。
  • 在对应的列中,找到相同项,如果存在对应的值a,则将其修改为b,并在修改后的值中添加一个特殊标记*。
  • 如果某一列已经被标记为*,则在对应的值修改时,所有使用该标记的行都需要再次进行修改。
  • 举个具体的例子,假设关系模式R(U,V,C,D,E)的函数依赖集F={A→D, E→D, D→B, BC→D, DC→A},分解ρ={AB, AE, CE, BCD, AC}。我们首先构建初始判断表:

    在处理A→D这一函数依赖时,我们发现A列中存在相同的项a1,而D列对应的值中没有a,因此我们需要修改对应的值为b,而由于这是第一次修改,我们给这个值加上一个特殊标记*。

    接着处理E→D,这里发现了相同的项a5,而对应的D列值已经被修改为b14,因此再次修改时,我们给所有相关位置的b14标记都加上星号,确保后续修改时不会遗漏。

    继续处理D→B,发现B列中存在a2,而D对应的值已经是b14,因此不需要标记。

    最后,处理BC→D时,发现BC列中的相同项a2和a3,D列中对应的值已经是a4,这里需要将D列中的相关值全部修改为a4,并处理已经存在的*b14标记。

    在处理DC→A时,找到DC列中的相同项a3和a4,A列中对应的值已经是a1,因此需要将相关位置的值全部修改为a1,并处理*b1的标记。

    经过这些修改后,我们检查最终表格,发现某一行中存在a1, a2, a3, a4的状态,这意味着存在无损连接,因此可以终止算法并标记该分解为无损连接。

    关于函数依赖的判断,我们需要确保分解后的关系能够完整地保持原有的函数依赖关系。具体来说,对于每一个函数依赖α→β,我们需要使用下面的算法来判断是否这个分解是保持函数依赖的:

    result = αwhile (result改变):对分解后的每个Ri:t = (result ∩ Ri) + Riresult = result ∪ t

    如果最终result包含β中的所有属性,说明函数依赖α→β成立,而整个分解就是保持了函数依赖的。

    举例来说,假设分解后的关系R1={A,B}, R2={B,C}, R3={C,D},函数依赖集F={A→B, B→C, C→D, D→A},那么在进行判断时:

    第一次迭代时,result={D},与R1交集为空,因此t为DXD对应的闭包,仍然是空集,result保持为{D}。接着与R2交集,还是为空,result不变。最后与R3交集,计算得出t={C,D},因此result变为{C,D}。继续循环,此时result={C,D},再次与R1交集为空,与R2交集得到{C}的闭包为空,与R3交集得到{C,D},因此result保持为{C,D}。再次检查发现result不再变化,判断结束。然而,这时候 {C,D} 不包含 A 属性,因此function dependency A→B 并未被保持,说明分解不是完全保持函数依赖的。

    当然,如果最终result包含了所有属性,那就说明分解是保持函数依赖的。

    转载地址:http://jhijz.baihongyu.com/

    你可能感兴趣的文章
    Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
    查看>>
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    Openlayers实战:modifystart、modifyend互动示例
    查看>>
    Openlayers实战:判断共享单车是否在电子围栏内
    查看>>
    Openlayers实战:绘制图形,导出geojson文件
    查看>>
    Openlayers实战:绘制图形,导出KML文件
    查看>>
    Openlayers实战:绘制多边形,导出CSV文件
    查看>>
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>
    Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
    查看>>
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>