博客
关于我
数据库模式分解----如何判断保持无损连接性和保持函数依赖
阅读量: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/

    你可能感兴趣的文章
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>
    MySQL 触发器
    查看>>
    mysql 让所有IP访问数据库
    查看>>
    mysql 记录的增删改查
    查看>>
    MySQL 设置数据库的隔离级别
    查看>>
    MySQL 证明为什么用limit时,offset很大会影响性能
    查看>>
    Mysql 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 通过查看mysql 配置参数、状态来优化你的mysql
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
    查看>>
    MySQL 错误
    查看>>
    mysql 随机数 rand使用
    查看>>