MySQL--三大范式(超详解)
目录
- 一、前言
- 二、三大范式
- 2.1概念
- 2.2第一范式(1NF)
- 2.3第二范式(2NF)
- 2.3第三范式(3NF)
一、前言
欢迎大家来到权权的博客~欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进哦~
博客主页链接点这里–>:权权的博客主页链接
二、三大范式
设计数据库的时候需要遵从的一些规范,目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
一般情况下满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般来说,数据库只需满足第三范式(3NF)就行了。
2.1概念
范式描述的是数据关系模型,一对一关系。一对多关系,多对多关系
2.2第一范式(1NF)
关系型数据库的一个基本的要求,不满足第一范式就不可以被称为关系型数据库
即表里的字段不可再分。
举例:设置一个学生表:

2.3第二范式(2NF)
在满足第一范式的基础上,不存在非主键字段对任意候选键的部分函数依赖。(存在于复合主键的情况下)
即在满足第一范式的基础上,还要满足数据表里的每一条数据记录,都是可唯一标识的,而且所有非主键字段,都必须完全依赖主键,不能只依赖主键的一部分。
正例:

反例:
学生选修课的成绩表:
| 学号 | 学生姓名 | 课程 | 学分 | 成绩 |
|---|---|---|---|---|
| 3 | 小肖 | MySQL | 3 | 100 |
上面这个表可以用学号跟课程作为复合主键来确定同学当前选修课的成绩。
学生的姓名跟课程没有关系,也就是说学生的姓名只依赖于学号,不依赖于课程。
学分与学号没有关系,也就是说学分依赖于课程,不依赖于学号。
对于由两个或者多个关键字段决定一条记录的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么这种就说她存在部分函数依赖。
如果有这样子的情况就说明这个表不满足第二范式。
学生选修课的成绩表:
| 学号 | 学生姓名 | 课程 | 学分 | 成绩 |
|---|---|---|---|---|
| 1 | 小肖 | MySQL | 3 | 100 |
| 2 | 小王 | MySQL | 3 | 90 |
| 3 | 小强 | JAVA | 2 | 80 |
| 4 | 小苏 | JAVA | 2 | 85 |
不满足第二范式会出现的问题(看上表):
1.数据冗余:
学生姓名、课程、学分都重复出现,造成了大量的数据冗余。
2.更新异常:
如果需要调整JAVA的学分,那么就需要更新所有记录关于JAVA的记录,如果一旦某些记录更新成功,某些更新失败,就会造成数据中某一课程学分不一致的情况,表现为数据不一致。
3.插入异常:
(学校新开了一门课,已经定义好了学分,但是学校里面没有任何关于这门课的记录)目前这样的设计,每一门课与同学的考试是对应关系,只有同学进行考试之后才会生成一条关于这门课的成绩记录,这条记录保存了课程的学分,也就是说在学生考试之前在数据库中是没有相应记录的,因为插入的课程信息如果学生的成绩记录为空,没有学生会愿意看到他的成绩是空的,所以是没有意义的,这就是插入异常。
4.删除异常
学生毕业之后,把毕业的同学考试记录全部都删除之后,删除记录的同时,也可能把课程对应的学分全部删除,导致一段时间内,数据库中没有课程和学分的相关信息。
2.3第三范式(3NF)
在第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。
两个强相关关系存在传递现象,这种传递关系称为传递依赖。比如学生表中拿到学号,可以根据学号拿到学校,根据学校又可以拿到学院等信息。
反例:
学生表:
| 学号 | 学生姓名 | 学院 | 学院地址 | 学院电话 |
|---|---|---|---|---|
| 2023 | 小肖 | 信科院 | 中国 | 1069 |
因为现在要描述的是一个学生表,所以可以看出来学号是一个主键。
在这个表中学生姓名跟学号具有强关系,学院地址跟学院电话是与学院强相关的。
可以看出来,这条记录中出现了两种强相关关系,这两个强相关关系存在传递现象:
学生姓名–>学号–>学院–>学院地址–>学院电话
这样的一个传递关系,称为传递依赖,这种设置不满足第三范式,因为存在传递依赖。
正例:
根据学生与与学院的关系,拆分成两个表即可。
学生表:
| 学号 | 学生姓名 | 学生年龄 | 学院编号 |
|---|---|---|---|
| 2023 | 小肖 | 20 | 0052 |
学院表:
| 学院编号 | 学院地址 | 学院电话 |
|---|---|---|
| 0052 | 长沙 | 0735 |

两张表都依赖于自己表中的主键,学生表可以通过外键与学院之间建立关联关系,第三范式可以解决数据冗余,更新异常,插入异常,删除异常的问题。

欧耶!!!我学会啦!!!
相关文章:
MySQL--三大范式(超详解)
目录 一、前言二、三大范式2.1概念2.2第一范式(1NF)2.3第二范式(2NF)2.3第三范式(3NF) 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进…...
追梦无Bug的软件世界
追梦无Bug的软件世界:测试人员的视角与探索 我有一个梦想,今天我们共同承载着一个愿景:创造一个没有Bug的软件世界。 我梦想有一天,用户将享受到完全无Bug的软件体验,用户不再因为软件中的Bug而感到困扰和沮丧。 我梦…...
在C#中使用Redis实现高效消息队列
使用Redis实现C#中的消息队列 Redis是一种开源的内存数据结构存储系统,因其高性能和灵活性被广泛用于缓存、数据库和消息队列等场景。本文将详细介绍如何在C#中使用Redis实现一个简单的消息队列,涵盖环境准备、代码实现和使用示例。 1. 环境准备 1.1 安装Redis 首先,确保…...
微服务JMeter解析部署使用全流程
目录 1、介绍 2、下载 3、运行 4、设置简体中文版 5、开始测试 1、添加线程组 2、添加监听器 3、添加请求 先.测试userController里的查询方法 6、查看结果 1、查看结果树 2、汇总报告 3、聚合报告 7、JMeter报错 1、介绍 Apache JMeter 是 Apache 组织基于 Java…...
Python 从入门到实战32(数据库MySQL)
我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…...
hrnet训练的pt模型结合目标检测进行关键点识别的更准确前向推理
本篇在将图像输入hrnet识别之前先进行目标检测来确定识别的位置,让识别更加精准。 本段代码设置了一个区域框BOX,让人走入区域内才开始检测,适用于考核等场景,也可以直接去掉BOX也是一样的效果。若画面背景中有多个行人࿰…...
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II 1. 解题思路2. 代码实现 题目链接:3306. Count of Substrings Containing Every Vowel and K Consonants II 1. 解题思路 这一题的话思路上就是一个滑动窗口,考察没一…...
算法笔记(五)——分治
文章目录 算法笔记(五)——分治快排颜色分类排序数组数组中的第K个最大元素库存管理 III 归并排序数组交易逆序对的总数计算右侧小于当前元素的个数翻转对 算法笔记(五)——分治 分治算法字面上的解释是“分而治之”,就…...
多级侧边菜单(递归)
需要编写两个文件 aside-menu.vue 和 menu-item.vue menu-item.vue <script setup> defineOptions({name: MenuItem}) defineProps({menuList: Array}) </script><template><template v-for"menu of menuList"><!-- 如果当前有子菜单&a…...
JavaScript break与continue语句
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。 break break语句用于跳出代码块或循环 for(i0;i<100;i){if(i5){break;}console.log(i);} continue continue语句用于应即终止本轮循环,返回循环结构的头部,开始下一轮循环。…...
算法【从递归入手一维动态规划】
动态规划:用空间代替重复计算,包含一整套原理和技巧的总和。后面会有非常多的文章介绍动态规划。 有些递归在展开计算时,总是重复调用同一个子问题的解,这种重复调用的递归变成动态规划很有收益。如果每次展开都是不同的解&#…...
Linux中的进程间通信之共享内存
共享内存 共享内存示意图 共享内存数据结构 struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kerne…...
第18周 3-过滤器
过滤器(Filter)概念总结 什么是过滤器 过滤器(Filter)是Java Web应用中用于统一拦截和处理请求的组件,类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理,确保请求符合特定要求。 过滤器的…...
Linux之进程概念
作者主页: 作者主页 本篇博客专栏:Linux专栏 创作时间 :2024年9月28日 基本概念: 进程说白了其实就是一个程序的执行实例,正在执行的程序。 在内核层面来说,就是一个担当分配资源(CPU时间…...
小程序-使用npm包
目录 Vant Weapp 安装 Vant 组件库 使用 Vant 组件 定制全局主题样式 API Promise化 1. 基于回调函数的异步 API 的缺点 2. 什么是 API Promise 化 3. 实现 API Promise 化 4.调用 Promise 化之后的异步 API 小程序对 npm 的支持与限制 目前,小程序中已经…...
【springboot】整合沙箱支付
目录 1. 配置沙箱应用环境2. 配置springboot项目1. 引入依赖2. 配置文件注册下载ngrok 3. 创建支付宝支付服务类4. 支付界面模板5. 控制类实现支付6. 测试 1. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后,看到以下页面,下…...
技术速递|Python in Visual Studio Code 2024年9月发布
排版:Alan Wang 我们很高兴地宣布将于 2024 年 9 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展! 此版本包括以下公告: Django 单元测试支持使用 Pylance 从 inlay 提示转到定义 如果您有兴趣,可以在我们的 Pyth…...
数据结构-3.5.队列的顺序实现
一.队列的顺序实现,初始化操作以及判断队列是否为空: 1.图解: 2.代码: #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…...
preconnect 预解析
preconnect 是一种浏览器优化技术,用于告诉浏览器提前与指定的域名建立连接,包括DNS解析、TCP握手和TLS协商(如果适用)。这样做可以减少客户端在请求资源时所需的往返时间(RTT),从而提高页面加载…...
Leecode热题100-283.移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
