【软考架构】候选键求解与主属性 / 非主属性判定

候选键求解 + 主属性/非主属性判定(数据库范式核心考点)

一、基础概念先理清

1. 候选键(候选码)

设关系模式 (R(U,F))(R(U,F))(R(U,F)),UUU 是属性集,FFF 函数依赖集。

  • 候选键 K :
    1. 闭包 K+=UK^+ = UK+=U(K可以推导出所有属性)
    2. K的任何真子集闭包 ≠ U(最小性,不能再去掉属性)

满足「完备性 + 最小性」的属性组就是候选键。

主键:从候选键里任选一个。

2. 主属性 & 非主属性

  • 主属性:任意一个候选键中包含的属性
  • 非主属性:不出现在任何候选键里的属性

重点易错:只要属性属于某一个候选码,就是主属性;多个候选键存在时,合并所有候选键的属性都是主属性。


二、求解候选键标准算法(属性分类法,考试通用)

步骤1:把所有属性分成4类

给定 (R(U,F))(R(U,F))(R(U,F))

  1. L类(仅出现在函数依赖左边):一定属于某个候选键
  2. R类(仅出现在函数依赖右边) :一定不在任何候选键中
  3. LR类(左右两边都出现):有可能在候选键,需要组合尝试
  4. N类(左右都不出现):一定属于某个候选键

步骤2:求解流程

  1. 先计算L ∪ N 属性组的闭包
    • 若闭包 = U:boldsymbolLcupNboldsymbol{Lcup N}boldsymbolLcupN 就是唯一候选键
  2. 若闭包 ≠ U:依次和 LR 类属性逐个、两两......组合,求闭包,找到满足最小性的组合。
  3. 剔除超键(存在真子集也是候选键),剩下全部候选键。

✅ 超键:能推出全体,但不满足最小性;候选键 = 最小超键

步骤3:判定主/非主属性

收集所有候选键包含的属性 → 主属性

剩下属性 → 非主属性


三、闭包计算方法(X+X^+X+)

求属性集X所能推导出的全部属性:

  1. 初始化 X+=XX^+ = XX+=X
  2. 反复扫描F:若存在 A→BA\to BA→B,左边全部在 X+X^+X+ 中,就把B加入 X+X^+X+
  3. 直到一轮扫描没有新增属性,停止

示例演示

例: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}

  1. 列出所有依赖左右属性
    左: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属性尝试

依次组合:

  1. 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 是候选键

  2. 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候选键

  3. 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


五、常见坑总结

  1. ❌ 误区:主键里的才叫主属性
    ✅ 正确:所有候选键包含的属性都是主属性,不止主键!
  2. ❌ 把超键当成候选键
    ✅ 必须验证最小性;只要还能删掉某个属性依旧覆盖全集,就只是超键
  3. R类属性绝对不可能属于候选键
  4. 存在多个候选键时,主属性取并集
相关推荐
RockHopper202515 小时前
元模型驱动的开发模式与软件开发智能体的认知负担(短文版)
系统架构·智能体·模型驱动·元模型驱动
Vitaliy Kostrov(柯维远)1 天前
谁来承担额外工作?CDN 参与者如何协商资源
nginx·缓存·系统架构·开源·cdn
省钱兄--zs1 天前
无人自助拼豆系统架构设计与功能实现落地部署全流程实战指南
java·数据仓库·spring boot·系统架构·需求分析
9624561 天前
餐饮 SaaS 优惠券系统架构演进(九)营销策略 DSL 与规则生命周期:从运营配置、静态校验到编译执行、影响面分析与安全发布
安全·系统架构
jerryinwuhan1 天前
从GPT到Agent:下一代人工智能系统架构演进
人工智能·gpt·系统架构
诚心呈意共享外卖配送系统1 天前
多平台订单聚合系统的技术架构:接 API 只是开始
java·开发语言·架构·系统架构·创业创新
mattleeee1 天前
多策略组合系统的架构演进:从单策略到全天候
系统架构·架构演进·多策略
梦帮科技2 天前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
quantdash_cc2 天前
量化数据清洗应该放在数据层还是策略层?从系统架构看清职责边界
开发语言·python·数据分析·系统架构·量化交易·股票数据·quantdash
ESDWAN2 天前
跨境投资与全球资产托管数字化解决方案:系统架构、数据治理与合规风控实践
大数据·金融·系统架构·云计算