梳理一下 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://www.pswp.cn/pingmian/96678.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96678.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/96678.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS后台任务调度:JobScheduler与WorkManager实战指南

本文将深入探讨HarmonyOS 5(API 12)中的后台任务调度机制,重点讲解JobScheduler和WorkManager的使用方法、适用场景及最佳实践,帮助开发者实现高效、智能的后台任务管理。 1. 后台任务调度概述 HarmonyOS提供了两种主要的后台任务…

Prompt工程实践

你在写prompt时候,是不是总觉得大模型它不听话。要么答非所问、要么一堆废话。扒开思考过程仔细阅读时而觉得它聪明绝顶,时而又觉得它愚蠢至极。明明已经对了怎么又推理到错的地方去了,明明在提示词中提醒过了不要这么思考它怎么就瞎想了。这…

基于springboot的毕业旅游一站式定制系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…

输入1.8V~5.5V 输出28V DCDC升压芯片TLV61046A

今天来一款TI的升压芯片TLV61046A。输入电压范围1.8V~5.5V。最高可以输出28V。开关电流980mA,那具体能输出多大的电流就得看输入输出的电压了。以上面的输入3.6V输出12V为例,效率是85%,那最高可以输出的电流就差不多只有200mA左右。封装也是非…

ubuntu22.04源码安装ffmpeg-4.4

# ubuntu22.04源码安装ffmpeg-4.4cd /tmpwget https://ffmpeg.org/releases/ffmpeg-4.4.6.tar.xztar -xvf ffmpeg-4.4.6.tar.xzcd ffmpeg-4.4.6apt updateapt install -y yasm pkg-config libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev libav…

Pyhon中字符串常用的函数

一、字符串的格式化1.format()方法format()是 Python 中用于字符串格式化的方法,通过占位符(如 {})动态插入变量或表达式。name小明 age18 grade99.556245585 information"我是{},今年{}岁了,考试得分:{:.2f}&quo…

小迪安全v2023学习笔记(八十一讲)—— 框架安全ThinkPHPLaravelStruts2SpringBootCVE复现

文章目录前记服务攻防——第八十一天开发框架安全&SpringBoot&Struts2&Laravel&ThinkPHP&CVE复现开发框架 - 常见语言开发框架PHP - 框架安全-Thinkphp&LaravelLaravel漏洞介绍漏洞复现CVE-2021-3129ThinkPHP漏洞介绍漏洞复现CVE-2018-1002015QVD-2022…

从音频到Token:构建原神角色语音识别模型的完整实践

本文将带你从零实现一个基于音频Token化的角色语音识别系统,完整复现原神角色语音分类任务,包含数据处理、模型训练和推理全流程。音频波形通过滑动窗口转换为数值Token序列的过程 一、为什么需要音频Token化? 传统音频处理通常依赖MFCC、频谱…

关于TCP和UDP两种网络协议的区别

1、tcp协议TCP (Transmission Control Protocol - 传输控制协议)TCP 的核心目标是为应用层提供一条可靠的、无差错的、有序的字节流通道。主要特点:面向连接:在数据传输之前,必须通过“三次握手”建立稳定的连接,传输结束后通过“…

Alibaba Lens:阿里巴巴推出的 AI 图像搜索浏览器扩展,助力B2B采购

本文转载自:https://www.hello123.com/alibaba-lens ** 一、🌟 一键截图,轻松找货:采购神器 Alibaba Lens 详解 Alibaba Lens 是阿里巴巴集团专为全球 B2B 采购商打造的一款智能浏览器插件(支持 Chrome 等主流浏览器…

WPF常见问题清单

1.Grid 内容自动换行及自适应行高 <DataGrid Grid.Row"1" FontSize"14" IsReadOnly"True" VerticalScrollBarVisibility"Auto" RowHeight"NaN" ItemsSource"{Binding List}" AutoGenerateColumns"False…

Linux驱动开发笔记(十)——中断

视频&#xff1a;第13.1讲 Linux中断实验-Linux内核中断框架简介_哔哩哔哩_bilibili 文档&#xff1a;《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81.pdf》五十一章 1. 中断API函数 每个中断都有一个中断号&#xff0c;通过中断号即可区分不同的中断。在Linux 内核中使用一…

ubuntu18.04安装PCL1.14

简化版说明 1. 安装依赖库&#xff1a; (1) boost1.84 &#xff08;https://www.boost.org/releases/1.84.0/&#xff09; tar vxf boost_xxx.tar.gz ./bootstrap.sh --prefix/usr/local/ ./b2 sudo ./b2 install (2) vtk9.1.0 &#xff08;https://vtk.org/files/releas…

python将pdf转txt,并切割ai

python将pdf转txt&#xff0c;并切割ai step1:pdf转换 from PIL import Image import pytesseract import os import tempfile from pdf2image import convert_from_path# 设置 Tesseract 路径 pytesseract.pytesseract.tesseract_cmd rC:\Users\wangrusheng\AppData\Local\Pr…

Ubuntu22.04更换阿里镜像源,ubuntu更换源

在 Ubuntu 22.04 上更换为阿里云镜像源可以加速软件包的下载和更新&#xff0c;大幅提升系统更新速度。以下是更换阿里云镜像源的步骤&#xff1a;1. 备份现有源列表在更换镜像源之前&#xff0c;建议先备份当前的源配置文件&#xff1a;bashsudo cp /etc/apt/sources.list /et…

Git版本控制工具+基础命令

Git是什么&#xff1f;Git是目前世界上最先进的分布式版本控制系统代码托管平台&#xff1a;Gitlab/Github/Gitee&#xff08;码云&#xff09;什么是版本控制系统&#xff1f;指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理。版本控制最主要的功能就是追…

图解设计模式【3】

本系列共分为三篇文章&#xff0c;其中包含的设计模式如下表&#xff1a; 名称设计模式图解设计模式【1】Iterator、Adapter、Template Method、Factory Method、Singleton、Prototype、 Builder、Abstract Factory、 Bridge、 Strategy图解设计模式【2】Composite、 Decorato…

(纯新手教学)计算机视觉(opencv)实战十四——模板与多个对象匹配

图片旋转、图片镜像相关教学&#xff1a; &#xff08;纯新手教学&#xff09;计算机视觉&#xff08;opencv&#xff09;实战十三——图片旋转、图片镜像 的几种常用方法-CSDN博客https://blog.csdn.net/2302_78022640/article/details/151356600?spm1011.2415.3001.5331 模板…

Java面试核心知识点总结:Redis与MySQL高可用、高并发解决方案

在分布式系统开发中&#xff0c;高并发场景下的数据一致性、系统可用性以及性能优化始终是核心挑战。本文基于Java技术栈&#xff0c;结合Redis与MySQL的工程实践&#xff0c;系统梳理分布式系统设计的关键技术要点。一、Redis集群架构演进与高可用实践1.1 主从哨兵模式部署方案…

R 语言科研绘图第 72 期 --- mantel检验图

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…