【数据库】— 无损连接、Chase算法、保持函数依赖
Chase算法
形式化定义:
- 构造一个kkk行nnn列的表格,每行对应一个模式Ri(1≤i≤k)Ri (1≤i ≤ k)Ri(1≤i≤k),每列对应一个属性Aj(1≤j≤n)Aj( 1≤j≤ n)Aj(1≤j≤n),若AjAjAj在RiRiRi中,则在表格的第iii行第jjj列处填上ajajaj,否则填上符号bijbijbij
- 检查FFF的每个FDFDFD,并修改表格中的元素,方法如下:
- 对于F中的函数依赖X→YX→YX→Y,若表格中有两行在XXX分量上相等,在YYY分量
上不相等,则修改YYY:- 若YYY的分量中有一个ajajaj,则另一个也修改为ajajaj;
- 如果没有ajajaj,则用其中一个bijbijbij替换另一个符号(iii是所有bbb中最小的行数) ,一直到表格不能修改为止
- 对于F中的函数依赖X→YX→YX→Y,若表格中有两行在XXX分量上相等,在YYY分量
- 若修改后,表格中有一行是全aaa,即a1a2…ana1a2…ana1a2…an,则ppp相对于FFF是无损连接的分解,否则不是
举例:
关系模式:R(A,B,C,D,E)分解:R1(A,D),R2(A,B),R3(B,E),R4(C,D,E),R5(A,E)函数依赖:F={A→C,B→C,C→D,DE→C,CE→A}判断R分解为p=R1,R2,R3,R4,R5是否是无损连接的分解关系模式:R(A,B,C,D,E)\\\\ {}\\\\ 分解:R1(A,D), R2(A,B), R3(B,E), R4(C,D,E), R5(A,E)\\\\ {}\\\\ 函数依赖:F=\\{A→C, B→C, C→D, DE→C, CE→A\\}\\\\ {}\\\\ 判断R分解为p={R1,R2,R3,R4,R5}是否是无损连接的分解 关系模式:R(A,B,C,D,E)分解:R1(A,D),R2(A,B),R3(B,E),R4(C,D,E),R5(A,E)函数依赖:F={A→C,B→C,C→D,DE→C,CE→A}判断R分解为p=R1,R2,R3,R4,R5是否是无损连接的分解
Chase算法举例
① 构造一个初始的二维表若“属性”属于“模式”中的属性,则填aj,否则填bij
② 根据A→C,对上表进行处理,由于属性列A上第1、2、5行相同均为a1,所以将属性列C上的b13、b23、b53改为同一个符号b13(取行号最小值)。
③ 根据B→C,对上表进行处理,由于属性列B上第2、3行相同均为a2,所以将属性列C上的b13、b33改为同一个符号b13(取行号最小值)。
④ 根据C→D,对上表进行处理,由于属性列C上第1、2、3、5行相同均为b13,所以将属性列D上的值均改为同一个符号a4。
⑤ 根据DE→C,对上表进行处理,由于属性列DE上第3、4、5行相同均为a4a5,所以将属性列C上的值均改为同一个符号a3。
⑥ 根据CE→A,对上表进行处理,由于属性列CE上第3、4、5行相同均为a3a5,所以将属性列A上的值均改为同一个符号a1。
⑦ 通过上述的修改,使第三行成为a1a2a3a4a5a1a2a3a4a5a1a2a3a4a5,则算法终止。且分解具有无损连接性。
Chase算法示例部分参考链接