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

【后端】数据库四大范式详细解析

梳理一下 MySQL(或关系型数据库)中的第一、二、三、四范式,这是数据库设计中非常重要的规范化理论。


1️⃣ 第一范式 (1NF:First Normal Form)

定义:字段具有原子性,不可再分。

  • 数据表中每一列都必须是不可分割的最小数据单元。

  • 每一行都应该是唯一的(通常通过主键来保证)。

✅ 举例:
不符合 1NF:

学生表
学号   姓名   联系方式
1     张三   1380000, 1391111

问题:联系方式有多个值,违反原子性。

符合 1NF:

学生表
学号   姓名   联系方式
1     张三   1380000
1     张三   1391111

2️⃣ 第二范式 (2NF:Second Normal Form)

定义:在 1NF 的基础上,要求每个非主属性完全依赖于主键,不能只依赖主键的一部分。

  • 适用于 联合主键 的情况。

  • 消除部分依赖

✅ 举例:
不符合 2NF:

选课表
学号+课程号 (联合主键)   姓名   成绩
1+001                  张三   95

问题:姓名只依赖学号,而不是依赖于 (学号+课程号) 这个整体主键。

符合 2NF(拆表):

学生表
学号   姓名选课表
学号   课程号   成绩

3️⃣ 第三范式 (3NF:Third Normal Form)

定义:在 2NF 基础上,非主属性不依赖于其他非主属性(消除传递依赖)。

  • 属性不能依赖于主键之外的属性。

✅ 举例:
不符合 3NF:

学生表
学号   姓名   系编号   系名称

问题:系名称依赖于系编号,而系编号又依赖学号(学号 → 系编号 → 系名称,产生传递依赖)。

符合 3NF(拆表):

学生表
学号   姓名   系编号系别表
系编号   系名称

4️⃣ 第四范式 (4NF:Fourth Normal Form)

定义:在 3NF 基础上,要求多值依赖消除

  • 一张表中不应包含两个或多个相互独立的多对多关系。

✅ 举例:
不符合 4NF:

学生表
学号   爱好       擅长课程
1     足球       数学
1     足球       英语
1     篮球       数学
1     篮球       英语

问题:爱好与擅长课程之间是独立的多值依赖,导致大量冗余。

符合 4NF(拆表):

学生_爱好表
学号   爱好学生_课程表
学号   擅长课程

🔑 总结

  • 1NF:字段不可再分(原子性)

  • 2NF:非主属性完全依赖主键(消除部分依赖)

  • 3NF:非主属性不依赖于其他非主属性(消除传递依赖)

  • 4NF:不允许一个表里有多个独立的多值依赖

👉 实际开发中:

  • 3NF 已经能满足大部分场景;

  • 4NF 更偏学术,业务里一般用到 3NF + 适当的反规范化(为了性能)。

👌 那我帮你整理一个 1NF ~ 4NF 对比表,方便快速理解和记忆:


📊 数据库范式对比表

范式要求典型问题示例(不符合)示例(符合)
第一范式 (1NF)字段必须原子化,不可再分字段中有多个值,违反原子性联系方式: 1380000, 1391111每条记录一条联系方式
第二范式 (2NF)在 1NF 基础上,非主属性必须完全依赖主键,不能部分依赖联合主键时,非主属性只依赖其中一部分(学号+课程号) → 姓名将姓名拆到“学生表”
第三范式 (3NF)在 2NF 基础上,非主属性不能依赖其他非主属性(消除传递依赖)非主属性依赖另一个非主属性学号 → 系编号 → 系名称把“系编号-系名称”拆到“系别表”
第四范式 (4NF)在 3NF 基础上,消除多值依赖(不能同时描述多个独立的多对多关系)一张表里既存储“爱好”,又存储“擅长课程”学号 → 爱好学号 → 擅长课程分成“学生_爱好表”和“学生_课程表”

📌 记忆口诀

  • 1NF:字段原子化

  • 2NF:消除部分依赖

  • 3NF:消除传递依赖

  • 4NF:消除多值依赖


画一个 范式演进示意图(从 1NF → 4NF,逐步拆表的过程)这样更直观。

画一个 1NF → 4NF 的演进示意图,用一个「学生」场景,逐步展示规范化的过程:


📝 范式演进示意图

❌ 未规范化

学生表
学号 | 姓名 | 联系方式           | 系名称  | 爱好   | 擅长课程
1    | 张三 | 1380000,1391111   | 计算机系 | 足球   | 数学

问题:

  • 联系方式不原子化(违反 1NF)

  • 姓名只依赖学号,不依赖课程号(违反 2NF)

  • 系名称依赖于系编号,而不是直接依赖学号(违反 3NF)

  • 爱好和课程是独立的多值依赖(违反 4NF)


✅ 第一范式 (1NF)

解决字段不可再分 → 拆分联系方式

学生表
学号 | 姓名 | 联系方式 | 系编号 | 系名称 | 爱好 | 擅长课程
1    | 张三 | 1380000  | 01    | 计算机 | 足球 | 数学
1    | 张三 | 1391111  | 01    | 计算机 | 足球 | 数学

✅ 第二范式 (2NF)

解决部分依赖 → 拆分“学生”和“选课”

学生表
学号 | 姓名 | 系编号选课表
学号 | 课程号 | 成绩

✅ 第三范式 (3NF)

解决传递依赖 → 把系名称单独拆表

学生表
学号 | 姓名 | 系编号系别表
系编号 | 系名称选课表
学号 | 课程号 | 成绩

✅ 第四范式 (4NF)

解决多值依赖 → 爱好、擅长课程单独拆表

学生表
学号 | 姓名 | 系编号系别表
系编号 | 系名称选课表
学号 | 课程号 | 成绩学生_爱好表
学号 | 爱好学生_课程表
学号 | 擅长课程

📌 最终结果

  • 每张表结构更清晰,避免冗余和异常(插入、更新、删除异常)。

  • 实际项目中常用到 3NF,4NF 更多是学术或复杂业务场景。


文章转载自:

http://KXaJEJXg.mhpkz.cn
http://ODjmiwbl.mhpkz.cn
http://fezwcryj.mhpkz.cn
http://XBsXVmOX.mhpkz.cn
http://xl0WNLEh.mhpkz.cn
http://qkjdaR52.mhpkz.cn
http://5MNUHpIM.mhpkz.cn
http://Ieolzigf.mhpkz.cn
http://n9raOVtB.mhpkz.cn
http://rWe1yuRW.mhpkz.cn
http://8Xrh5UPw.mhpkz.cn
http://lbE76U63.mhpkz.cn
http://eAQu2ysW.mhpkz.cn
http://TiiIT4io.mhpkz.cn
http://LF7CAmNw.mhpkz.cn
http://AUNJCTvj.mhpkz.cn
http://m79e1SYr.mhpkz.cn
http://d7kQf6H2.mhpkz.cn
http://5cnOwzAs.mhpkz.cn
http://JplBhf2p.mhpkz.cn
http://7zplqN1o.mhpkz.cn
http://2cPnfwCa.mhpkz.cn
http://HkTEd4c6.mhpkz.cn
http://I9lPuvrL.mhpkz.cn
http://1Z2hh3r7.mhpkz.cn
http://aZhp6vKV.mhpkz.cn
http://8pyuA9bO.mhpkz.cn
http://AUSYnTdG.mhpkz.cn
http://LOjChepa.mhpkz.cn
http://o2Nibt7o.mhpkz.cn
http://www.dtcms.com/a/384113.html

相关文章:

  • 银河麒麟部署mysql8.0并连接应用
  • Mysql中有那些锁
  • React 状态管理(手写实现react-redux)
  • C++:类和对象(下)
  • 智能驾驶再加速:L4 级 AI 系统落地难点与城市试点经验总结
  • 第4章:CPU进阶命令
  • brew@homebrew@linux通用包管理工具linuxbrew
  • NumPy 是 Python 科学计算的基石
  • LLMs之RL之GRPO:《Magistral》的翻译与解读
  • FPGA入门-数码管静态显示
  • 【大模型】企业级应用场景概览
  • uTools 轻工具 简洁又方便
  • Can总线原理
  • Matplotlib 全面详解:从入门到高级应用
  • 爬虫获取API接口的实战指南
  • 裸机开发 时钟配置,EPIT
  • TypeScript项目中,ESLint配置支持子路径的模块导入
  • 机器视觉中的工业相机接口该如何选择?
  • Knockout.js DOM 节点清理模块详解
  • 基于Python的个性化书籍推荐管理系统【2026最新】
  • Java Collection集合框架:体系、核心与选型
  • 最长递减子序列 动态规划
  • C# --- Field and Property
  • 一次 界面无法启动的问题 的解决记录
  • 011=基于YOLO12电动车进电梯检测与警告系统(Python+PySide6界面+训练代码)
  • Antminer S19 Pro 92T矿机详细参数解析与挖矿能力分析
  • LChot100--1143. 最长公共子序列
  • Android开发-选择按钮
  • [温习C/C++]0x06 坐标系中矩形重叠类问题分析
  • 拓扑排序应用——火星词典