数据库设计
最小覆盖的计算
\(FOR\ ALL\ X\ \rightarrow\ A\ in\ H\)
\(\ \ \ \ J = H - \{ X \rightarrow A \}\)
\(\ \ \ \ DETERMINE X_+ UNDER J\)
\(\ \ \ \ IF\ A\in X_+\)
\(\ \ \ \ \ \ \ \ H = H - \{ X \rightarrow A \}\)
\(END FOR\)
候选键的确定
设关系模式 \(R\) 中有 \(n\) 个属性,分别为 \(A_1, ... , A_n\)。
《数据库原理、编程与性能》一书中给出的方法如下:
\(K := Head(T)\)
\(for each attribute A in K {\)
\(if (K - A)_F^+ contains all the attributes in T {\)
\(K := K - {A}\)
\(}\)
\(}\)
但这种方法需要考虑所有的属性序列,对每个属性序列依次进行上述算法。另一种较快速的算法如下:
每个属性在函数依赖集中一定符合以下 4 种形式之一:
- 在左右都出现
- 只在左边出现
- 只在右边出现
- 未出现
算法步骤:
- 只在函数依赖的右边出现的属性,不属于候选键
- 只在函数依赖的左边出现的属性,一定属于某个候选键
- 外部属性一定存在于每个候选键中
- 其他属性逐个与步骤 2 和 3 所得的属性组合,求属性闭包,直至 X 的闭包等于 \(Head(T)\)