Skip to content
难度基础(★)
建议时长45分钟

3.6.4 范式判断-01

本课核心知识点整理
本课核心知识点手绘流程图(SVG)

范式判断要层层推进

范式不是并列概念,而是逐层提高的规范化程度。只有满足 1NF,才讨论 2NF;只有满足 2NF,才讨论 3NF;满足 3NF 后,才进一步看 BCNF。

mermaid
flowchart LR
  A["属性原子"] --> B["1NF"]
  B --> C["消除非主属性对候选键的部分依赖"]
  C --> D["2NF"]
  D --> E["消除非主属性对候选键的传递依赖"]
  E --> F["3NF"]
  F --> G["每个决定因素都包含候选键"]
  G --> H["BCNF"]

本节先看 1NF 和 2NF。核心问题是:属性是不是原子的,非主属性是不是完整依赖于整个候选键。

1NF:属性值不可再分

1NF 要求每个属性值都是不可再分的原子值。比如“联系电话”字段里同时塞入“手机号、座机、紧急联系人电话”,在需要分别检索和维护时就不够原子。

情况是否满足 1NF说明
姓名=张三通常满足题干未要求拆姓和名
地址=省/市/区/详细地址取决于题干若需要分别查询省市区,应拆分
课程列表=C01,C02,C03不满足一个单元格存多个课程值
电话1, 电话2, 电话3形式上原子但设计差有重复组,应考虑独立联系方式表

考试通常默认给出的属性已不可再分,除非题干明确出现多值、重复组或复合字段。

2NF:非主属性必须完全依赖候选键

2NF 建立在 1NF 基础上,要求所有非主属性都完全函数依赖于候选键。它主要解决组合候选键下的部分依赖。

设:

选课(学号,课程号,成绩,学分)

如果函数依赖为:

(学号,课程号)成绩课程号学分

候选键是 {学号, 课程号}成绩 依赖整个组合键,因为只有知道某学生和某课程,才能确定成绩;但 学分 只依赖组合键的一部分 课程号,这就是非主属性对候选键的部分函数依赖,因此该关系只达到 1NF,不满足 2NF。

为什么部分依赖会造成冗余

如果一个课程有很多学生选,学分会在多条选课记录中重复。课程学分变化时要改多行;如果没有学生选某课程,就无法仅保存课程学分;删除最后一条选课记录还可能丢失课程学分信息。

分解思路是“哪里不满足就拆哪里”:

课程(课程号,学分)选课(学号,课程号,成绩)

注意 课程号 不能从选课关系中完全拿走,因为剩余关系还需要用 {学号, 课程号} 决定成绩,也需要与课程关系连接还原。

2NF 快速判断

情况快速结论原因
候选键只有单属性至少不会因部分依赖破坏 2NF单属性没有可再拆的真子集
没有非主属性至少满足 2NF没有非主属性可发生部分依赖
候选键是组合属性必须检查部分依赖组合键的一部分可能决定非主属性
非主属性由整个候选键决定对 2NF 友好属于完全函数依赖

“至少”二字很重要。单属性候选键可以避免部分依赖,但还可能存在传递依赖,所以不一定满足 3NF。

做题路线

  1. 默认先判断 1NF:属性是否原子。
  2. 求候选键,标出主属性和非主属性。
  3. 如果候选键是组合属性,逐个检查非主属性是否被组合键的一部分决定。
  4. 一旦发现部分依赖,最高只能判到 1NF;若题目要求改进,就把造成部分依赖的属性拆成独立关系。

例题

单选
1NF 的基本要求是:
单选
判断 2NF 时重点检查:

自查要点

  1. 1NF 判断的关键是什么?
  2. 为什么 2NF 要先求候选键?
  3. 部分函数依赖通常在什么情况下出现?