无损分解、判断是否是无损分解的方法
2018-02-12 14:00
281 查看
无损分解
对于任何表T以及它的一个函数依赖集F,T的一个分解是一个表的集合{T1,T2,…Tk},该集合具有两个性质:
(1)对于这个集合中的每一个表Ti,Head(Ti)是Head(T)的一个子集;
(2)Head(T)=Head(T1) U Head(T2) U ….U Head(Tk)。
如果对于表T的任何内容,F中的函数依赖都保证如下关系成立,则称表T的一个分解相对于函数依赖集F是一个无损分解,有时候也称为一个无损连接分解。即满足:
T=T1 join T2 join …join Tk
注意:
无损分解的定义要求分解出的表的连接能得到原始表的信息,而这应当对原始表将来任何可能的内容成立。
定理1
给定表T和属性集X,X属于Head(T),下面的两个陈述是等价的:
(1)X是T的一个超键。
(2)X->Head(T),即属性集X函数决定了T中的所有属性。等价表述为X+ =Head(T)。
证明:
已知(1),由超键的定义可以知道,T中的X属性唯一标识一行,即任意两行在X属性上相同,则其余属性的值必定相同。也就是说若任意两行X属性相同,则这两行完全相同,即这两行在所有属性上都相同。这意味着X->Head(T)。
已知(2),X->Head(T),由函数依赖的定义可知,表T的两行不能在X上具有相同值而同时在Head(T)的属性上取不同值。这说明两个不同的行不能在X上取相同值,所有X唯一标识一行,即X是T的一个超键。
定理2
给定表T和它的有效函数依赖集F,一个把T分为两个 表{T1,T2}的分解是T的一个无损分解,当且仅当Head(T1)和Head(T2)都是Head(T)的真子集,Head(T)=Head(T1) U Head(T2)(也就是说,T的所有属性在T1或者T2中重复),同时如下函数依赖之一可以通过F推导出来:
(1)Head(T1) 交 Head(T2)->Head(T1)
或者
(2)Head(T1) 交 Head(T2)->Head(T2)
例:
给定表T,Head(T)=A B C,有函数依赖B->C。分解成表T1和T2,Head(T1)=A B,Head(T2)=B C。运用定理2,我们有Head(T1) 交 Head(T2)->Head(T2),也就是B->BC,这从B->C是显而易见的。所以该分解是无损分解。
对于任何表T以及它的一个函数依赖集F,T的一个分解是一个表的集合{T1,T2,…Tk},该集合具有两个性质:
(1)对于这个集合中的每一个表Ti,Head(Ti)是Head(T)的一个子集;
(2)Head(T)=Head(T1) U Head(T2) U ….U Head(Tk)。
如果对于表T的任何内容,F中的函数依赖都保证如下关系成立,则称表T的一个分解相对于函数依赖集F是一个无损分解,有时候也称为一个无损连接分解。即满足:
T=T1 join T2 join …join Tk
注意:
无损分解的定义要求分解出的表的连接能得到原始表的信息,而这应当对原始表将来任何可能的内容成立。
定理1
给定表T和属性集X,X属于Head(T),下面的两个陈述是等价的:
(1)X是T的一个超键。
(2)X->Head(T),即属性集X函数决定了T中的所有属性。等价表述为X+ =Head(T)。
证明:
已知(1),由超键的定义可以知道,T中的X属性唯一标识一行,即任意两行在X属性上相同,则其余属性的值必定相同。也就是说若任意两行X属性相同,则这两行完全相同,即这两行在所有属性上都相同。这意味着X->Head(T)。
已知(2),X->Head(T),由函数依赖的定义可知,表T的两行不能在X上具有相同值而同时在Head(T)的属性上取不同值。这说明两个不同的行不能在X上取相同值,所有X唯一标识一行,即X是T的一个超键。
定理2
给定表T和它的有效函数依赖集F,一个把T分为两个 表{T1,T2}的分解是T的一个无损分解,当且仅当Head(T1)和Head(T2)都是Head(T)的真子集,Head(T)=Head(T1) U Head(T2)(也就是说,T的所有属性在T1或者T2中重复),同时如下函数依赖之一可以通过F推导出来:
(1)Head(T1) 交 Head(T2)->Head(T1)
或者
(2)Head(T1) 交 Head(T2)->Head(T2)
例:
给定表T,Head(T)=A B C,有函数依赖B->C。分解成表T1和T2,Head(T1)=A B,Head(T2)=B C。运用定理2,我们有Head(T1) 交 Head(T2)->Head(T2),也就是B->BC,这从B->C是显而易见的。所以该分解是无损分解。
相关文章推荐
- 模式分解是否为无损连接的判断方法
- 模式分解是否为无损连接的判断方法
- 模式分解是否为无损连接的判断方法
- 模式分解---无损连接性的判断方法(转)
- js下判断 iframe 是否加载完成的完美方法
- java中判断字符串是否为数字的方法的几种方法 ava中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str)
- jQuery判断checkbox是否选中的3种方法
- VC中判断是否数字的方法
- 两种不同方法判断Excel表格中是否存在指定数值
- java,c++判断字符串是否为空的方法总结
- 判断输入字符串是否等效Int32位数字的两种方法:int.TryParse(string s,out int result)和 Try Catch
- Python实现判断一行代码是否为注释的方法
- php网站判断用户是否是手机访问的方法
- PHP 判断数组是否为空的5大方法
- Shell中判断字符串是否为数字的6种方法分享
- android 判断手机是否是国内的手机的方法
- PHP 判断数组是否为空的方法
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- Android之判断某个服务是否正在运行的方法