候选码 主属性 非主属性

​主属性(Prime Attribute)的定义​
主属性是属于至少一个候选码(Candidate Key)的属性。简单来说,主属性是候选码的组成部分,而非主属性(Non-prime Attribute)是不属于任何候选码的属性。


​核心概念解析​

  1. 候选码(Candidate Key)
    • 定义:能唯一标识关系中所有元组的最小属性集合。

    • 示例:在学生表中,学号身份证号均可作为候选码(假设两者都能唯一标识学生)。

  2. 主属性与非主属性
    • 主属性:候选码中的任意一个属性。

    ◦ 例:候选码为 {学号, 课程},则学号课程均为主属性。

    • 非主属性:不属于任何候选码的属性。

    ◦ 例:学生表中的姓名年龄等是非主属性。

  3. 主键(Primary Key)
    • 定义:从候选码中选定的一个作为主标识符,用于实际数据库操作。

    • 主键与主属性的关系:主键是候选码的一个特例,其属性也是主属性。


​主属性在范式中的作用​

  1. 第三范式(3NF)
    • 允许主属性之间的依赖:若主属性之间存在函数依赖(如 候选码A → 主属性B),仍满足3NF。

    • 示例:

    ◦ 表结构:选课(学号, 课程, 教师),候选码为 {学号, 课程}

    ◦ 依赖:课程 → 教师(课程是主属性,教师是非主属性)。

    ◦ 问题:教师传递依赖于候选码,但课程是主属性,因此该依赖不违反3NF。

  2. BCNF(Boyce-Codd范式)
    禁止主属性对候选码的依赖:若存在非平凡依赖 X → Y,且 X 不是候选码,则违反BCNF(无论Y是主属性还是非主属性)。

    • 示例:

    ◦ 候选码为 {学号, 课程},依赖 课程 → 教师(课程是主属性)。

    ◦ 问题:课程不是候选码,但决定了教师,违反BCNF。需拆分为:

    1. 选课表(学号, 课程)  
    2. 课程表(课程, 教师)  

​主属性 vs 非主属性对比​

类型 定义 范式约束中的角色
主属性 属于至少一个候选码的属性 BCNF中禁止主属性被非候选码决定
非主属性 不属于任何候选码的属性 3NF中禁止非主属性传递依赖候选码

​常见误区​

  1. 主属性 ≠ 主键:
    • 主键是人为选定的唯一标识符,而主属性是候选码的逻辑组成部分。

    • 例:若候选码为 {学号, 身份证号},两者都是主属性,但主键只能选其一。

  2. 主属性之间允许依赖吗?
    • 3NF允许:主属性之间可以存在依赖(如 候选码A → 主属性B)。

    • BCNF禁止:若依赖 X → Y 中,X 不是候选码,即使 Y 是主属性,也违反BCNF。


​总结​
• 主属性是候选码的组成部分,其依赖关系直接影响BCNF的判定。

• 3NF允许主属性之间的依赖,BCNF要求所有非平凡依赖的决定方必须是候选码(包括主属性的依赖)。

• 设计原则:优先满足BCNF,若无法保持函数依赖,则退而满足3NF。

你可能感兴趣的:(数据库,sql,mysql)