首页 默认分类 正文
  • 本文约1038字,阅读需5分钟
  • 275
  • 0

数据库范式

1. 第一范式(1NF)

定义

  • 原子性:表中每个字段不可再分
  • 数据类型一致性:同一列数据类型相同
  • 主键约束:每行数据有唯一标识

案例

不符合1NF的表

员工表(员工ID, 姓名, 联系方式[电话,邮箱])
  • 问题:联系方式字段包含多个值

符合1NF的表

员工表(员工ID, 姓名, 电话, 邮箱)

2. 第二范式(2NF)

定义

  • 满足1NF
  • 消除部分依赖:非主属性必须完全依赖主键

案例

不符合2NF的表

订单表(订单ID, 产品ID, 产品名称, 数量, 单价)
  • 主键:(订单ID, 产品ID)
  • 部分依赖:产品名称 → 产品ID(不依赖整个主键)

符合2NF的表

订单表(订单ID, 产品ID, 数量, 单价)
产品表(产品ID, 产品名称)

3. 第三范式(3NF)

定义

  • 满足2NF
  • 消除传递依赖:非主属性不能依赖其他非主属性

案例

不符合3NF的表

学生表(学号, 系别, 系主任)
  • 传递依赖:学号 → 系别 → 系主任

符合3NF的表

学生表(学号, 系别)
系别表(系别, 系主任)

4. BC范式(BCNF)

定义

  • 满足3NF
  • 每个非平凡函数依赖的左边都是候选键
  • 消除主属性对非候选键的依赖

案例

不符合BCNF的表

课程表(课程ID, 教师ID, 课程名称)
  • 函数依赖:
    • 课程ID → 课程名称
    • 教师ID → 课程ID(一个教师只教一门课)
  • 候选键:[课程ID], [教师ID]
  • 问题:教师ID → 课程ID的左边不是候选键

符合BCNF的表

课程表(课程ID, 课程名称)
教师表(教师ID, 课程ID)

范式对比总结

范式 核心要求 消除的依赖类型 案例场景
1NF 字段原子性 复合字段 拆分联系方式字段
2NF 非主属性完全依赖主键 部分依赖 订单与产品信息分离
3NF 非主属性无传递依赖 传递依赖 学生与系别信息分离
BCNF 每个函数依赖左边都是候选键 主属性对非候选键的依赖 教师与课程关系规范化

规范化步骤示例

原表结构

学生选课表(学号, 课程号, 成绩, 教师, 教师办公室)

函数依赖

  • (学号, 课程号) → 成绩
  • 课程号 → 教师
  • 教师 → 教师办公室

规范化过程

  1. 1NF:确保字段不可再分(已满足)
  2. 2NF
    • 学生选课表(学号, 课程号, 成绩)
    • 课程表(课程号, 教师)
  3. 3NF
    • 学生选课表(学号, 课程号, 成绩)
    • 课程表(课程号, 教师)
    • 教师表(教师, 教师办公室)
  4. BCNF
    • 学生选课表(学号, 课程号, 成绩)
    • 课程表(课程号, 课程名称)
    • 教师表(教师ID, 课程号)
    • 办公室表(教师ID, 办公室)

实际应用建议

  • 1NF:所有关系型数据库必须满足
  • 2NF/3NF:业务系统最常用的范式级别
  • BCNF:适用于数据一致性要求极高的场景(如金融系统)
  • 反规范化:为提高查询性能,可适当保留冗余数据(需权衡读写频率)
收藏

扫描二维码,在手机上阅读
评论