0%

数据库范式

数据库范式详解:从函数依赖到规范化实践

数据库范式(Normal Forms)是关系型数据库设计的规范,通过消除数据冗余和异常(插入、删除、修改异常),确保数据结构的合理性。范式的定义基于函数依赖理论,从低到高分为 1NF、2NF、3NF、BCNF 等,每一级范式都是对前一级的进一步优化。

函数依赖:范式的理论基础

函数依赖描述了关系中属性之间的约束关系,是理解范式的前提。常见类型包括:

1. 完全函数依赖

  • 定义:若 X→Y(X 决定 Y),且 X 的任何真子集都不能决定 Y,则 Y 对 X 完全函数依赖。
  • 示例:在关系 成绩(学号, 课程号, 分数) 中,(学号, 课程号)→分数 是完全函数依赖 —— 单独的 “学号” 或 “课程号” 都无法确定分数。
  • 特点:若候选键是单属性(如仅 “学号”),则所有依赖于该键的属性必然是完全函数依赖。

2. 部分函数依赖

  • 定义:若 X→Y,但 X 中至少有一个真子集能单独决定 Y,则 Y 对 X 部分函数依赖。
  • 示例:在关系 学生(学号, 身份证号, 姓名) 中,(学号, 身份证号)→姓名 是部分函数依赖 ——“学号” 或 “身份证号” 均可单独决定姓名。

3. 传递函数依赖

  • 定义:若 X→Y(Y 不包含于 X),且 Y→Z(Z 不包含于 Y),则 Z 对 X 传递函数依赖。
  • 示例:在关系 学生(学号, 系别, 系主任) 中,学号→系别系别→系主任,因此 “系主任” 传递依赖于 “学号”。

关键概念

  • 候选键:能唯一标识关系中所有属性的最小属性集(可以是单个属性或复合属性)。主键是从候选键中选择的一个。
  • 主属性:候选键中包含的属性;非主属性:不在任何候选键中的属性。

范式定义与实例解析

1. 第一范式(1NF):属性原子性

  • 要求:关系中所有属性(字段)必须是不可再分的原子值(即字段不能包含子字段或集合)。
  • 反例
    关系 用户(姓名, 地址) 中,“地址” 字段包含 “省、市、区”(如 “浙江省杭州市西湖区”),不符合 1NF。
  • 修正
    拆分为 用户(姓名, 省, 市, 区),每个字段均为原子值,符合 1NF。

2. 第二范式(2NF):消除部分函数依赖

  • 前提:满足 1NF。

  • 要求所有非主属性必须完全依赖于候选键(消除非主属性对候选键的部分函数依赖)。

  • 反例:

    关系选课(学号, 课程号, 姓名, 分数)中,候选键是(学号, 课程号):

    • “分数” 完全依赖于 (学号, 课程号)(符合);
    • “姓名” 仅依赖于 “学号”(部分依赖,不符合 2NF)。
      问题:数据冗余(同一学生选多门课,姓名重复存储)、修改异常(改姓名需改所有记录)。
  • 修正:

    拆分为两个关系:

    • 学生(学号, 姓名)(候选键 “学号”);
    • 选课(学号, 课程号, 分数)(候选键 (学号, 课程号))。
      此时非主属性均完全依赖于候选键,符合 2NF。

3. 第三范式(3NF):消除传递函数依赖

  • 前提:满足 2NF。

  • 要求所有非主属性不传递依赖于候选键(即非主属性之间不能有依赖关系)。

  • 反例:

    关系学生(学号, 姓名, 系别, 系主任)中,候选键是 “学号”:

    • “姓名”“系别” 完全依赖于 “学号”(符合 2NF);
    • “系主任” 依赖于 “系别”,而 “系别” 依赖于 “学号”,因此 “系主任” 传递依赖于 “学号”(不符合 3NF)。
      问题:数据冗余(同一系的系主任重复存储)、删除异常(删除所有学生则系信息丢失)。
  • 修正:

    拆分为两个关系:

    • 学生(学号, 姓名, 系别)(候选键 “学号”);
    • 系(系别, 系主任)(候选键 “系别”)。
      此时非主属性均不传递依赖于候选键,符合 3NF。

4. BCNF(鲍依斯 - 科德范式):消除主属性的依赖

  • 前提:满足 3NF。

  • 要求所有函数依赖的决定因素必须包含候选键(即主属性不能依赖于非候选键的属性,消除主属性对候选键的部分 / 传递依赖)。

  • 反例:

    关系教学(学生, 课程, 教师)中,候选键为(学生, 课程)和(学生, 教师)

    (假设一个学生一门课对应一个教师,一个学生一个教师对应一门课):

    • 存在依赖 教师→课程(一个教师只教一门课);
    • 决定因素 “教师” 不包含任何候选键(候选键均为复合属性),因此不符合 BCNF。
      问题:插入异常(无法插入 “教师教某课程” 但暂无学生选的记录)。
  • 修正:

    拆分为两个关系:

    • 教师课程(教师, 课程)(候选键 “教师”);
    • 学生选课(学生, 教师)(候选键 (学生, 教师))。
      此时所有决定因素(如 “教师”)均包含候选键,符合 BCNF。

范式之间的关系与应用原则

范式层次关系

1
1NF ←(消除部分依赖)→ 2NF ←(消除传递依赖)→ 3NF ←(消除主属性依赖)→ BCNF
  • 高级范式必然满足低级范式(如 BCNF 一定满足 3NF,3NF 一定满足 2NF)。
  • 范式级别越高,数据冗余越少,异常问题越少,但关系表数量可能越多,查询时需更多连接操作(可能影响性能)。

规范化的权衡

  • 目的:减少冗余和异常,使数据库结构更清晰。
  • 限制:并非范式越高越好。过度规范化可能导致表数量激增,查询效率下降(多表连接耗时)。
  • 实践原则:大多数业务场景中,满足 3NF 即可平衡冗余和性能;特殊场景(如高并发读)可适当反规范化(增加冗余换取查询效率)

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10