数据库关系模式系统原理,闭包,候选键,最小函数依赖集

数据库关系模式系统原理,闭包,候选键,最小函数依赖集


因为是根据自己的理解写的,欢迎指出错误

闭包

闭包:就是由一个属性直接或间接推导出的所有属性的集合
解法:一组一组的判断,如果左边的在闭包中,那边将右边的加入闭包
例:设关系R(A,B,C,D,E,G)有函数依赖集
	F={ABC,BCAD,DE,CGB},求AB的闭包。
	AB+={A,B}, 			ABC: 	A,B都在AB+中,那么将C加入AB+
	AB+={A,B,C}, 		BCAD: 	B,C都在AB+中,那么将D加入AB+
	AB+={A,B,C,D}, 		DE: 	DAB+中,那么将E加入AB+
	AB+={A,B,C,D,E}, 	CGB: 	C,G不在AB+中,不做改变
	所以,AB的闭包AB+={A,B,C,D,E}

候选键

候选码:
	1.只在右边的一定不是候选码
	2.只在左边的一定是候选码,两边都没有的一定是候选码
	3.将两边都有的和确定的候选码组合
	4.求出他们的闭包,如果闭包等于全集u,那么它就是候选码
例:R<U,F>,U=(A,B,C,D,E,G),F={AB->C,CD->E,E->A,A->G},求候选码。
	只在右边的R: 	G
	只在左边的L: 	B,D
	两边都没有的N:
	两边都有的LR: A,C,E
	先求L+N=BD+BD+={B,D} != U
	于是跟LR组合,得到ABD,BCD,BDE
	ABD+={A,B,C,D,E,G}	== U
	BCD+={A,B,C,D,E,G}	== U
	BDE+={A,B,C,D,E,G}	== U
	所以,三个都是候选码:(ABD),(BCD),(BDE)

最小函数依赖集

最小函数依赖集:
	1.F中的每个FD的右边都是单属性。
	2.F中没有冗余的FD3.F中每个FD的左边没有冗余的属性。
例如:关系模式R(UF)中,U={ABCDEG}F={BDDGC,BDE,AGB,ADGBC}F的最小函数依赖集。
解题步骤:
	1.F中的每个FD的右边都是单属性。
		F={BDDGC,BDE,AGB,ADGB,ADGC}
	2.F中没有冗余的FD。
		依次求去掉本身后,每组的闭包,如果它的闭包里面有右边的,那么就去除
		BD 	B+=B				没有D,所以保留
		DGC 	DG+=D,G				没有C,所以保留
		BDE 	BD+=B,D				没有E,所以保留
		AGB 	AG+=A,G				没有B,所以保留
		ADGB 	ADG+=A,D,G,C,B,EB,所以去除
		ADGC 	ADG+=A,D,G,B,E,CC,所以去除
		F={BDDGC,BDE,AGB}
	3.F中每个FD的左边没有冗余的属性。
		BD			B+=B				没有冗余,保留
		DGC		D+=D 	G+=G		没有冗余,保留
		BDE		B+=B,D 	D+=D	 	D冗余,去除,保留B
		AGB		A+=A 	G+=G 		没有冗余,保留
		所以F={BDDGC,BE,AGB}
  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现数据库系统函数依赖属性闭包的算法,可以使用Python编程语言。以下是一种可能的算法实现: ```python # 定义函数依赖类 class FunctionalDependency: def __init__(self, lhs, rhs): self.lhs = lhs self.rhs = rhs # 计算属性的闭包 def compute_closure(attributes, functional_dependencies): closure = set(attributes) # 初始化闭包为属性集合 closure_changed = True while closure_changed: closure_changed = False for fd in functional_dependencies: if fd.lhs.issubset(closure) and not fd.rhs.issubset(closure): closure = closure.union(fd.rhs) closure_changed = True # 闭包发生变化 return closure # 测试示例 attributes = {'A', 'B', 'C', 'D'} functional_dependencies = [ FunctionalDependency({'A'}, {'B'}), FunctionalDependency({'A'}, {'C'}), FunctionalDependency({'C', 'D'}, {'A', 'B'}) ] closure = compute_closure(attributes, functional_dependencies) print("属性的闭包为:", closure) ``` 以上代码定义了一个`FunctionalDependency`类来表示函数依赖,并实现了`compute_closure`函数来计算属性的闭包。在测试示例中,我们定义了一些属性和函数依赖,并调用`compute_closure`函数来计算属性的闭包。最后,打印输出结果。 算法实现的思路是通过迭代的方式,不断查找闭包中是否有新的属性加入。首先,将闭包初始化为属性集合。然后,对每个函数依赖进行判断,如果函数依赖的左侧属性是闭包的子集并且右侧属性不是闭包的子集,则将右侧属性加入闭包,并标记闭包发生变化。循环迭代,直到闭包不再发生变化为止。最后,返回计算得到的闭包。 以上就是一个可能的Python实现算法,可能还有其他实现方式,具体实现可以根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值