功能依赖
如果两个具有相同属性 A 值的元组也具有相同属性 B 的值,则关系中的函数依赖 A->B 成立。 例如,在表 1 中的关系 STUDENT 中,函数依赖
STUD_NO->STUD_NAME, STUD_NO->STUD_PHONE hold
但
STUD_NAME->STUD_ADDR do not hold
如何找到关系的函数依赖?
关系中的函数依赖依赖于关系的域。考虑表 1 中给出的 STUDENT 关系。
- 我们知道 STUD_NO 对每个学生来说都是独一无二的。所以 STUD_NO->STUD_NAME、STUD_NO->STUD_PHONE、STUD_NO->STUD_STATE、STUD_NO->STUD_COUNTRY 和 STUD_NO -> STUD_AGE 都为真。
- 类似地, STUD_STATE->STUD_COUNTRY 将为真,就好像两条记录具有相同的 STUD_STATE,它们也将具有相同的 STUD_COUNTRY。
- 对于关系 STUDENT_COURSE,COURSE_NO->COURSE_NAME 将为真,因为具有相同 COURSE_NO 的两条记录将具有相同的 COURSE_NAME。
函数依赖集:关系的函数依赖集或 FD 集是关系中存在的所有 FD 的集合。例如,表 1 所示的关系 STUDENT 的 FD 集为:
{ STUD_NO->STUD_NAME, STUD_NO->STUD_PHONE, STUD_NO->STUD_STATE, STUD_NO->STUD_COUNTRY,
STUD_NO -> STUD_AGE, STUD_STATE->STUD_COUNTRY }
属性闭包:属性集的属性闭包可以定义为可以从功能上确定的属性集。
如何找到属性集的属性闭包?
要查找属性集的属性闭包:
- 将属性集的元素添加到结果集。
- 递归地将元素添加到结果集中,这些元素可以从结果集的元素功能上确定。
使用表 1 的 FD 集,可以确定属性闭包为:
(STUD_NO)+ = {STUD_NO, STUD_NAME, STUD_PHONE, STUD_STATE, STUD_COUNTRY, STUD_AGE}
(STUD_STATE)+ = {STUD_STATE, STUD_COUNTRY}
如何使用属性闭包找到候选键和超级键?
- 如果一个属性集的属性闭包包含关系的所有属性,则该属性集将是该关系的超级键。
- 如果该属性集的任何子集都不能在功能上确定关系的所有属性,则该集也将是候选键。例如,使用表 1 的 FD 集,
(STUD_NO, STUD_NAME)+ = {STUD_NO, STUD_NAME, STUD_PHONE, STUD_STATE, STUD_COUNTRY, STUD_AGE}
(STUD_NO)+ = {STUD_NO, STUD_NAME, STUD_PHONE, STUD_STATE, STUD_COUNTRY, STUD_AGE}
(STUD_NO, STUD_NAME) 将是超级键但不是候选键,因为它的子集 (STUD_NO)+ 等于关系的所有属性。因此, STUD_NO 将是候选键。
门问题:考虑关系方案 R = {E, F, G, H, I, J, K, L, M, M} 和函数依赖集 {{E, F} -> {G}, {F } -> {I, J}, {E, H} -> {K, L}, K -> {M}, L -> {N} 在 R 上。R 的键是什么? (GATE-CS-2014)
A. {E, F}
B. {E, F, H}
C. {E, F, H, K, L}
D. {E}
答案:找到所有给定选项的属性闭包,我们得到:
{E,F}+ = {EFGIJ}
{E,F,H}+ = {EFHGIJKLMN}
{E,F,H,K,L}+ = {{EFHGIJKLMN}
{E}+ = {E}
{EFH}+ 和 {EFHKL}+ 导致所有属性的集合,但 EFH 是最小的。所以它将是候选键。所以正确的选项是(B)。
如何检查是否可以从给定的 FD 集导出 FD?
要检查是否可以从 FD 集 F 导出 FD A->B,
- 使用 FD 集 F 找到 (A)+。
- 如果 B 是 (A)+ 的子集,则 A->B 为真,否则为假。
GATE 问题:在具有属性 A、B、C、D 和 E 的模式中,给出了以下一组函数依赖项
{A -> B, A -> C, CD -> E, B -> D, E -> A}
上面的集合不隐含以下哪个函数依赖? (门 IT 2005)
A. CD -> AC
B. BD -> CD
C. BC -> CD
D. AC -> BC
答案:使用问题中给出的 FD 集,
(CD)+ = {CDEAB} 这意味着 CD -> AC 也成立。
(BD)+ = {BD} 这意味着 BD -> CD 不能成立。所以这个FD并不隐含在FD集合中。所以(B)是必需的选项。
其他的可以用同样的方法检查。
素数和非素数属性
作为关系的任何候选键的一部分的属性称为主要属性,其他的称为非主要属性。例如,STUDENT 关系中的 STUD_NO 为素数属性,其他为非素数属性。
GATE 问题:考虑一个关系方案 R = (A, B, C, D, E, H),其中以下函数依赖成立:{A–>B, BC–> D, E–>C, D–>A }. R的候选键是什么? [门 2005]
(a) AE、BE
(b) AE、BE、DE
(c) AEH、BEH、BCH
(d) AEH、BEH、DEH
答案: (AE)+ = {ABECD} 这不是所有属性的集合。所以AE不是候选键。因此选项A和B是错误的。
(AEH)+ = {ABCDEH}
(BEH)+ = {BEHCDA}
(BCH)+ = {BCHDA} 这不是所有属性的集合。所以 BCH 不是候选密钥。因此选项C是错误的。
所以正确答案是D。