什么是最小函数依赖集?
如果函数依赖集F满足一下条件,则称F为一个最小函数依赖集。
(1)F中任意一函数的右部仅含有一个属性。
(2)F中不存在这样的函数依赖X→A,使得F与F-{X-A}等价,即F中的函数依赖均不能由F中其他函数依赖导出。
(3)F中不存在这样的函数依赖X→A,X有真子集Z使得F-{X→A}{Z→A}与F等价,即F中各函数依赖的左部均为最小属性集(也就是说左部不存在冗余属性)。
如何计算最小函数依赖集?
算法步骤:
(1)将F中的所有函数依赖的右边化为单一属性;
(2)去掉F中的所有函数依赖左边的冗余属性;
(3)去掉F中所有冗余的函数依赖。
F的函数最小依赖集并不是唯一的,它与对各函数依赖及X→A中X个属性的处置的顺序有关。
【例题】已知函数依赖集F={A→BD, AB→C, C→D},求F的最小函数依赖集。
解题思路:
(1)将F中的所有函数依赖的右边化为单一属性:F={A→B, A→D, AB→C, C→D}。
(2)去掉F中的所有函数依赖左边的冗余属性:观察F,发现可能要处理的函数依赖为AB→C。
先求属性A关于F的闭包:
A→B,A,B自然在中;
AB→C,C也在中;
C→D,D也在中;
(闭包的具体求解算法请参考:如何求属性集X关于F的闭包?)
因此,={A, B, C, D},即A能根据Armstrong公理推导出B,C,D,说明函数依赖AB→C左边的属性B是冗余的,可以去掉。处理后的F={A→B, A→D, A→C, C→D}。
同理,还需要看属性B关于F的闭包,来判断AB→C左边的A是否是冗余的。={B},因此A不是冗余的。
(3)去掉F中所有冗余的函数依赖关系:我们试着看一下函数依赖A→D是否是冗余的。
先去掉A→D,处理后的F={A→B, A→C, C→D};
求A关于处理后F的闭包:={A, B, C, D};
发现=,说明即使不需要F中的函数依赖A→D,属性A也能根据Armstrong公理导出D,因此A→D是冗余的,可以去掉,去掉后得到F的最小依赖集={A→B, A→C, C→D}。
参考自:《数据库系统概论》,王珊,萨师煊编著