候选键求解 + 主属性/非主属性判定(数据库范式核心考点)
一、基础概念先理清
1. 候选键(候选码)
设关系模式 (R(U,F))(R(U,F))(R(U,F)),UUU 是属性集,FFF 函数依赖集。
- 候选键 K :
- 闭包 K+=UK^+ = UK+=U(K可以推导出所有属性)
- K的任何真子集闭包 ≠ U(最小性,不能再去掉属性)
满足「完备性 + 最小性」的属性组就是候选键。
主键:从候选键里任选一个。
2. 主属性 & 非主属性
- 主属性:任意一个候选键中包含的属性
- 非主属性:不出现在任何候选键里的属性
重点易错:只要属性属于某一个候选码,就是主属性;多个候选键存在时,合并所有候选键的属性都是主属性。
二、求解候选键标准算法(属性分类法,考试通用)
步骤1:把所有属性分成4类
给定 (R(U,F))(R(U,F))(R(U,F))
- L类(仅出现在函数依赖左边):一定属于某个候选键
- R类(仅出现在函数依赖右边) :一定不在任何候选键中
- LR类(左右两边都出现):有可能在候选键,需要组合尝试
- N类(左右都不出现):一定属于某个候选键
步骤2:求解流程
- 先计算L ∪ N 属性组的闭包
- 若闭包 = U:boldsymbolLcupNboldsymbol{Lcup N}boldsymbolLcupN 就是唯一候选键
- 若闭包 ≠ U:依次和 LR 类属性逐个、两两......组合,求闭包,找到满足最小性的组合。
- 剔除超键(存在真子集也是候选键),剩下全部候选键。
✅ 超键:能推出全体,但不满足最小性;候选键 = 最小超键
步骤3:判定主/非主属性
收集所有候选键包含的属性 → 主属性
剩下属性 → 非主属性
三、闭包计算方法(X+X^+X+)
求属性集X所能推导出的全部属性:
- 初始化 X+=XX^+ = XX+=X
- 反复扫描F:若存在 A→BA\to BA→B,左边全部在 X+X^+X+ 中,就把B加入 X+X^+X+
- 直到一轮扫描没有新增属性,停止
示例演示
例:R(A,B,C,D), F={A→B, BC→D, D→A}R(A,B,C,D),\ F=\{A\to B,\ BC\to D,\ D\to A\}R(A,B,C,D), F={A→B, BC→D, D→A}
- 列出所有依赖左右属性
左:A、BC、D
右:B、D、A
属性:A,B,C,D
分类:
L类:C(只出现在左侧)
R类:无
LR类:A,B,D
N类:无
第一步:先算{C}+\{C\}^+{C}+
{C}+={C}≠{A,B,C,D}\{C\}^+ = \{C\} \neq \{A,B,C,D\}{C}+={C}={A,B,C,D},需要搭配LR属性尝试
依次组合:
-
AC+\boldsymbol{AC}^+AC+
{A,C}\{A,C\}{A,C}
A→B⇒+BA\to B \Rightarrow +BA→B⇒+B;BC→D⇒+DBC\to D \Rightarrow +DBC→D⇒+D
AC+={A,B,C,D}=UAC^+=\{A,B,C,D\}=UAC+={A,B,C,D}=U
检查最小性:去掉A,{C}+≠U\{C\}^+\neq U{C}+=U;去掉C,{A}+≠U\{A\}^+\neq U{A}+=U
⇒AC\Rightarrow AC⇒AC 是候选键
-
BC+\boldsymbol{BC}^+BC+
{B,C}\{B,C\}{B,C},BC→D⇒+DBC\to D\Rightarrow +DBC→D⇒+D;D→A⇒+AD\to A\Rightarrow +AD→A⇒+A
BC+={A,B,C,D}=UBC^+=\{A,B,C,D\}=UBC+={A,B,C,D}=U,最小性成立 ⇒ BC候选键
-
DC+\boldsymbol{DC}^+DC+
{D,C}\{D,C\}{D,C},D→A⇒+AD\to A\Rightarrow +AD→A⇒+A;A→B⇒+BA\to B\Rightarrow +BA→B⇒+B
DC+=UDC^+=UDC+=U,最小性成立 ⇒ DC候选键
✅ 全部候选键:AC、BC、DC\boldsymbol{AC、BC、DC}AC、BC、DC
判定主属性/非主属性
候选键属性集合:{A,B,C,D}\{A,B,C,D\}{A,B,C,D}
所有属性都出现在候选码中
→ 主属性:A,B,C,D;无任何非主属性
这种关系不存在非主属性,一定满足3NF,同时满足BCNF需要额外校验。
四、典型例题练习(自测)
例题1
KaTeX parse error: Can't use function '\(' in math mode at position 20: ...B,C,D,E),\ F=\{\̲(̲\boldsymbol{AB}...
属性分类:
L:A、B
R:E
LR:C、D
N:无
计算 {A,B}+\{A,B\}^+{A,B}+
KaTeX parse error: Can't use function '\(' in math mode at position 21: ...\}\xrightarrow{\̲(̲\boldsymbol{AB}...
KaTeX parse error: Can't use function '\(' in math mode at position 1: \̲(̲\boldsymbol{AB}...
候选键只有:KaTeX parse error: Can't use function '\(' in math mode at position 13: \boldsymbol{\̲(̲\boldsymbol{AB}...
主属性:A、B
非主属性:C、D、E
例题2(高频易错题)
R(A,B,C),F={A→C,B→C}R(A,B,C),F=\{A\to C,B\to C\}R(A,B,C),F={A→C,B→C}
分类:
L:A、B
R:C
LR:无
N:无
{A}+={A,C}≠U\{A\}^+=\{A,C\}\neq U{A}+={A,C}=U
{B}+={B,C}≠U\{B\}^+=\{B,C\}\neq U{B}+={B,C}=U
KaTeX parse error: Can't use function '\(' in math mode at position 3: \{\̲(̲\boldsymbol{AB}...
候选键:KaTeX parse error: Can't use function '\(' in math mode at position 13: \boldsymbol{\̲(̲\boldsymbol{AB}...
主属性:A,B;非主属性:C
五、常见坑总结
- ❌ 误区:主键里的才叫主属性
✅ 正确:所有候选键包含的属性都是主属性,不止主键! - ❌ 把超键当成候选键
✅ 必须验证最小性;只要还能删掉某个属性依旧覆盖全集,就只是超键 - R类属性绝对不可能属于候选键
- 存在多个候选键时,主属性取并集