当前位置: 首页 > news >正文

数据库4个范式的说明

在数据库设计中,范式(Normal Form)用于消除冗余和异常,确保数据一致性。以下是第一范式、第二范式、第三范式和BCNF(Boyce-Codd Normal Form,即第四范式)的示例说明:

1. 第一范式(1NF)—— 消除重复数据

要求:所有字段都是原子性值,即每个字段中只能包含单一值,不能包含重复或多重数据。

不符合1NF的示例

学生表
+-----------+---------+-------------------+
| 学生编号   | 姓名    | 课程              |
+-----------+---------+-------------------+
| 001       | 张三    | 数学, 语文         |
| 002       | 李四    | 英语               |
| 003       | 王五    | 化学, 物理         |
+-----------+---------+-------------------+
  • 这里的 课程 列包含了多个值(数学和语文在同一个单元格中),这不符合1NF。

符合1NF的示例

学生表
+-----------+---------+---------+
| 学生编号   | 姓名    | 课程    |
+-----------+---------+---------+
| 001       | 张三    | 数学    |
| 001       | 张三    | 语文    |
| 002       | 李四    | 英语    |
| 003       | 王五    | 化学    |
| 003       | 王五    | 物理    |
+-----------+---------+---------+
  • 这里每个字段的值都是原子性的。

2. 第二范式(2NF)—— 消除部分依赖

要求:在符合1NF的基础上,表中的所有非主属性必须完全依赖于主键(不能有部分依赖)。

不符合2NF的示例

选课表
+-----------+---------+---------+---------+
| 学生编号   | 课程    | 成绩    | 学生电话 |
+-----------+---------+---------+---------+
| 001       | 数学    | 90      | 123456  |
| 001       | 语文    | 85      | 123456  |
| 002       | 英语    | 88      | 987654  |
+-----------+---------+---------+---------+
  • 这里主键是 学生编号 + 课程 的组合,但 学生电话 只依赖于 学生编号,而与 课程 无关,这就是部分依赖

符合2NF的示例
将数据分解成两个表:

  1. 学生表(学生编号, 姓名, 学生电话)
+-----------+---------+---------+
| 学生编号   | 姓名    | 学生电话 |
+-----------+---------+---------+
| 001       | 张三    | 123456  |
| 002       | 李四    | 987654  |
+-----------+---------+---------+
  1. 成绩表(学生编号, 课程, 成绩)
+-----------+---------+---------+
| 学生编号   | 课程    | 成绩    |
+-----------+---------+---------+
| 001       | 数学    | 90      |
| 001       | 语文    | 85      |
| 002       | 英语    | 88      |
+-----------+---------+---------+
  • 现在每个非主属性(如学生电话)都完全依赖于主键。

3. 第三范式(3NF)—— 消除传递依赖

要求:在符合2NF的基础上,所有非主属性必须直接依赖于主键,而不能通过其他非主属性间接依赖主键。

不符合3NF的示例

学生表
+-----------+---------+-------------+---------+
| 学生编号   | 姓名    | 班级        | 班主任  |
+-----------+---------+-------------+---------+
| 001       | 张三    | 101         | 王老师  |
| 002       | 李四    | 102         | 李老师  |
+-----------+---------+-------------+---------+
  • 这里 班主任 是通过 班级 依赖于 学生编号,而不是直接依赖主键(学生编号),这是传递依赖

符合3NF的示例
将数据分解成两个表:

  1. 学生表(学生编号, 姓名, 班级)
+-----------+---------+-------------+
| 学生编号   | 姓名    | 班级        |
+-----------+---------+-------------+
| 001       | 张三    | 101         |
| 002       | 李四    | 102         |
+-----------+---------+-------------+
  1. 班级表(班级, 班主任)
+-------------+---------+
| 班级        | 班主任  |
+-------------+---------+
| 101         | 王老师  |
| 102         | 李老师  |
+-------------+---------+
  • 现在,班主任直接依赖于班级,不再有传递依赖。

4. BCNF(Boyce-Codd范式,第四范式)—— 处理多值依赖和候选键

要求:在符合3NF的基础上,每个非主属性必须依赖于候选键的超集,即任何候选键都能唯一确定表中的所有属性。

不符合BCNF的示例

教师课程表
+-----------+---------+---------+
| 教师编号   | 课程    | 教室    |
+-----------+---------+---------+
| T001      | 数学    | A101    |
| T001      | 语文    | A102    |
| T002      | 英语    | A101    |
+-----------+---------+---------+
  • 在这个表中,主键是 教师编号 + 课程,但是 教室 可以由 课程 唯一确定(每门课程都在同一个教室上课),这破坏了 BCNF 规范。

符合BCNF的示例
分解成两个表:

  1. 教师课程表(教师编号, 课程)
+-----------+---------+
| 教师编号   | 课程    |
+-----------+---------+
| T001      | 数学    |
| T001      | 语文    |
| T002      | 英语    |
+-----------+---------+
  1. 课程教室表(课程, 教室)
+---------+---------+
| 课程    | 教室    |
+---------+---------+
| 数学    | A101    |
| 语文    | A102    |
| 英语    | A101    |
+---------+---------+
  • 现在每个非主属性都依赖于候选键,没有多值依赖或不合理的键依赖。

总结

  • 1NF:确保每个字段都是原子性值。
  • 2NF:消除部分依赖,所有非主属性都完全依赖于主键。
  • 3NF:消除传递依赖,所有非主属性直接依赖于主键。
  • BCNF:确保每个非主属性依赖于候选键的超集,解决候选键的多值依赖问题。
http://www.lryc.cn/news/435407.html

相关文章:

  • Excel怎么截图?快速捕捉工作表的多种方法
  • MyBatis动态SQL标签总结、开发手册、高阶用法(动态SQL、OGNL、批量操作、片段重用、 SQL 组合、 执行优化、嵌套查询与延迟加载)
  • 出处不详 取数游戏
  • 拉取ros2_control_demos存储库
  • Apache Doris Flink Connector 24.0.0 版本正式发布
  • ‌语音控制小夜灯的实现方案介绍
  • 万龙觉醒免费辅助:VMOS云手机辅助巴克尔阵容搭配攻略!
  • 【English】长难句翻译
  • npm login 或者 npm publish 超时timeout
  • Python的openpyxl使用記錄(包含合併單元格,圖片下載和圖片插入,設置邊框,設置背景顏色)
  • 基于springboot+vue实现的在线商城系统
  • fastjson漏洞--以运维角度进行修复
  • 82页精品PPT | 构建数字化工厂的智能制造-数字化智能制造
  • Python的10个日期和时间操作的实用技巧
  • 关于大模型在产品开发中所面临的问题,利用大模型技术解决很简单!
  • SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)
  • BUUCTF 之Basic 1(BUU LFI COURSE 1)
  • Android 蓝牙三方和动态权限三方
  • 点餐|基于java的电子点餐系统小程序(源码+数据库+文档)
  • 18、Gemini-Pentest-v1
  • MIT6.824 课程-MapReduce
  • 7个 C# 高阶用法详解:从基础到实战
  • [数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别
  • 【SQL】百题计划:SQL对于空值的比较判断。
  • OJ在线判题系统项目笔记
  • 期望极大算法(Expectation Maximization Algorithm,EM)
  • 初级练习[4]:多表查询——表联结
  • 基于JAVA+SpringBoot+Vue的中药实验管理系统
  • 移动硬盘读取出错结构损坏?数据恢复实战指南
  • Web安全之HTTPS调用详解和证书说明案例示范