候选码 主属性 非主属性
主属性(Prime Attribute)的定义
主属性是属于至少一个候选码(Candidate Key)的属性。简单来说,主属性是候选码的组成部分,而非主属性(Non-prime Attribute)是不属于任何候选码的属性。
核心概念解析
-
候选码(Candidate Key)
• 定义:能唯一标识关系中所有元组的最小属性集合。• 示例:在学生表中,
学号
和身份证号
均可作为候选码(假设两者都能唯一标识学生)。 -
主属性与非主属性
• 主属性:候选码中的任意一个属性。◦ 例:候选码为
{学号, 课程}
,则学号
和课程
均为主属性。• 非主属性:不属于任何候选码的属性。
◦ 例:学生表中的
姓名
、年龄
等是非主属性。 -
主键(Primary Key)
• 定义:从候选码中选定的一个作为主标识符,用于实际数据库操作。• 主键与主属性的关系:主键是候选码的一个特例,其属性也是主属性。
主属性在范式中的作用
-
第三范式(3NF)
• 允许主属性之间的依赖:若主属性之间存在函数依赖(如候选码A → 主属性B
),仍满足3NF。• 示例:
◦ 表结构:
选课(学号, 课程, 教师)
,候选码为{学号, 课程}
。◦ 依赖:
课程 → 教师
(课程是主属性,教师是非主属性)。◦ 问题:教师传递依赖于候选码,但课程是主属性,因此该依赖不违反3NF。
-
BCNF(Boyce-Codd范式)
• 禁止主属性对候选码的依赖:若存在非平凡依赖X → Y
,且X
不是候选码,则违反BCNF(无论Y是主属性还是非主属性)。• 示例:
◦ 候选码为
{学号, 课程}
,依赖课程 → 教师
(课程是主属性)。◦ 问题:
课程
不是候选码,但决定了教师,违反BCNF。需拆分为:1. 选课表(学号, 课程) 2. 课程表(课程, 教师)
主属性 vs 非主属性对比
类型 | 定义 | 范式约束中的角色 |
---|---|---|
主属性 | 属于至少一个候选码的属性 | BCNF中禁止主属性被非候选码决定 |
非主属性 | 不属于任何候选码的属性 | 3NF中禁止非主属性传递依赖候选码 |
常见误区
-
主属性 ≠ 主键:
• 主键是人为选定的唯一标识符,而主属性是候选码的逻辑组成部分。• 例:若候选码为
{学号, 身份证号}
,两者都是主属性,但主键只能选其一。 -
主属性之间允许依赖吗?
• 3NF允许:主属性之间可以存在依赖(如候选码A → 主属性B
)。• BCNF禁止:若依赖
X → Y
中,X
不是候选码,即使Y
是主属性,也违反BCNF。
总结
• 主属性是候选码的组成部分,其依赖关系直接影响BCNF的判定。
• 3NF允许主属性之间的依赖,BCNF要求所有非平凡依赖的决定方必须是候选码(包括主属性的依赖)。
• 设计原则:优先满足BCNF,若无法保持函数依赖,则退而满足3NF。