理解基本概念
-
定义
- 候选码:一组具有以下特性的属性集合:①唯一性(无重复值)、②最小性(不可再约简),在学生表中,若“学号”能唯一区分每个学生且不含多余字段,则它构成一个候选码。
- 主属性 vs 非主属性:属于任一候选码的属性称为主属性,其余为非主属性。
-
与关键字的区别
一个关系可能有多个候选码,但最终选定其中一个作为主键(Primary Key),某表可能同时以身份证号或员工编号作为候选码,二者择一为主键。
求解步骤详解
第1步:列出所有可能的属性组合
从单一属性开始逐步扩展至多属性组合,排查潜在的候选资格,具体操作如下:
✅ 单属性检验
检查每个单独属性是否满足唯一性和非空约束。
| 属性名 | 是否可能成为候选码? | 判断依据 |
|———|———————|————————|
| A | ✔️ | 无重复且不为NULL |
| B | ❌ | 存在重复值 |
若某单属性已满足条件,则直接记录为候选码之一;否则进入下一步。
✅ 多属性联合验证
当单个属性无法唯一标识时,需尝试两两组合、三三组合等,假设关系R(U)={A,B,C,D},依次测试{A,B}, {A,C}, …直到找到最小有效集合。
第2步:应用闭包函数测试法
使用属性闭包(Attribute Closure)算法验证某属性集是否能函数决定全集中的所有其他属性,公式化为:若α⁺=U(全集),则α可作为超码;进一步筛选出最小的超码即为候选码。
示例演示:设关系模式S(学号,姓名,年龄,课程ID,成绩),已知依赖集F={学号→姓名, (学号,课程ID)→成绩},求候选码的过程如下:
- 计算{学号}⁺ = {学号,姓名} ≠ U → 不是超码;
- 计算{学号,课程ID}⁺ = {学号,姓名,课程ID,成绩} = U → 该组合是超码且不可缩减,故为候选码。
第3步:排除冗余属性
对已确定的超码进行极小化处理,若发现{A,B,C}是一个超码,但去掉B后{A,C}仍能覆盖全集,则原组合并非最小,应替换为更短的组合。
典型场景分类讨论
类型 | 特征 | 解决方法 | 示例 |
---|---|---|---|
全码关系 | 所有属性共同构成唯一标识 | 整个属性组即唯一候选码 | 如订单明细表(订单号,商品ID) |
复合候选码 | 需多个属性联合才能唯一标识 | 通过闭包运算逐层叠加验证 | 选课记录(学生ID+课程ID→成绩) |
含外键的情况 | 外键可能参与形成新候选码 | 同时考虑本关系和参照关系的约束 | 部门员工表中“部门编号+工号” |
常见误区警示
⚠️ 错误1:混淆候选码与主键
候选码可以有多个,而主键仅选择一个用于实现索引,学生表中“身份证号”“学籍号”都可能成为候选码,但只需选其一作主键。
⚠️ 错误2:忽略部分函数依赖导致的遗漏
必须全面分析给定的函数依赖集F,比如在图书借阅系统中,若存在依赖“读者证号+书籍条形码→借阅日期”,则这两个属性的组合才是候选码,而非单独使用读者证号。
实战案例解析
以教学管理系统中的“选课”关系为例:SC(学生ID,课程号,成绩),函数依赖集F={学生ID→姓名, 课程号→课程名, (学生ID,课程号)→成绩},求解过程如下:
- 单属性测试:学生ID只能确定姓名,无法覆盖课程号和成绩;同理课程号也不行;
- 双属性测试:{学生ID,课程号}的闭包包含全部属性,且无冗余,因此是唯一候选码。
FAQs
Q1: 如果一个关系中存在多个重叠的候选码怎么办?
答:这是正常现象,教师表中可能有工号、身份证号两个独立的候选码,此时任选一个作为主键即可,其他候选码保留用于完整性约束检查。
Q2: 如何判断某个属性一定是所有候选码都包含的主属性?
答:若移除该属性后会导致无法构成任何候选码,则其必为主属性,数学上表现为:对于属性X,若所有候选码都包含X,则X是必需的主属性,可通过反证法验证——假设存在不包含X的候选码Y,若Y
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/89170.html