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] 输出: […...
如何高效使用Prompt与AI大模型对话
一、如何与人工智能对话 在人工智能的世界里,提示词(Prompt)就像是一把钥匙,能够解锁AI智能助手的潜力,帮助你更高效地获取信息、解决问题。但如何正确使用这把钥匙,却是一门艺术。本文将带你了解提示词的…...
Java 之深入理解 String、StringBuilder、StringBuffer
前言 由于发现 String、StringBuilder、StringBuffer 面试的时候会经常问到,这里就顺便总结一下:本文重点会以这三个字符串类的性能、线程安全、存储结构这三个方面进行分析 ✨上期回顾:Java 哈希表 ✨目录 前言 String 介绍 String 的不可变…...
vue3项目执行pnpm update后还原package.json文件后运行报错
项目场景: vue官方版本已更新到vue3.5,项目中还在使用vue3.4,因此想要更新项目vue版本。 问题描述 执行了 pnpm update 命令,一键更新了所有包,更新完成后项目不能正常运行。为了还原项目代码,先删除 nod…...
蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555
蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1,脉冲部分代码2,ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …...
SolveigMM Video Splitter方便快捷视频分割合并软件 V3.6.1309.3-供大家学习研究参考
视频分割功能(Splitter)支持各种编码格式的AVI(DivX、DV、MJPEG、XVID、MPEG-4)、WMV、ASF(DivX、MJPEG、XVID、MPEG-4、WM Video 7/9)F、MPEG(*.mpg、*.mpeg、*.mpv、*.m2v、*.vob)文件、也支持受损的WMV、ASF格式的分割。视频合并功能(Joiner)则支持AVI、WMV/ASF、WMA、MP3、…...
Unity3D 创建一个人物,实现人物的移动
1,创建项目 首先打开我们的Unity Hub 在我们的编译器下面新建项目,选择3D模板,更改一下我们的项目名称,选择一下路径,然后点击创建项目 等待项目创建。。。。。。 我们在项目里先创建一个plane,这样有点视…...
【笔记】数据结构12
文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结,这里记录一下。 知识点汇总 2013年408应用题41 解决方法: 方法一 (1)算法思想 算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元…...
django的URL配置
1 django如何处理一个请求 首先Django要使用根URLconf模块,通过setting.py配置文件的ROOT_URLCONF来设置。 加载该模块后并查找变量 urlpatterns。这是一个Python的django.conf.urls.url()实例列表。 Django按顺序运行每个URL模式,并在匹配所请求的…...
精华帖分享 | 因子构建思考1
本文来源于量化小论坛股票量化板块精华帖,作者为z-coffee。 以下为精华帖正文: 一段时间没写帖子,其实一直在研究策略,只是从不同的角度去思考而已。熟悉我的老板其实清楚,我的炉子水平一般,基本不太依托…...
kubernetes笔记(四)
一、Pod调度策略 1.基于节点的调度 spec->nodeName [rootmaster ~]# vim myhttp.yaml --- kind: Pod apiVersion: v1 metadata:name: myhttp spec:nodeName: node-0001 # 基于节点名称进行调度containers:- name: apacheimage: myos:httpd[rootmaster ~]# kubectl a…...
长宁企业网站制作/数据分析师报考条件
指纹解锁哪家强?要好看还是要实用?近年来随着手机领域科技水平的进步和设计理念的更新迭代,手机厂商在指纹解锁这一功能上也是玩出了花,搭载前置指纹、后置指纹、侧面指纹、屏下指纹的手机都有,消费者也是挑得眼花缭乱…...
工程管理毕业设计代做网站/互联网营销的五个手段
转载: 前端招聘与前端卖身的困境最近开始物色新公司,群里来了个招人的,说2.5万招高手。在众人的怂恿下,发了简历。 但结果是不如意的,经过他们一小时的评测,他们认为我的水平不过8k-10k,税前。我…...
wordpress最大文件上传大小修改/免费推广网站推荐
mysql的data路径尽量不要设置到其他地方,最好设置在mysql路径下的data目录,不然1067错误是不会消失的!mysql配置文件内容如下:[client]port 3306default-character-setutf8[mysql]default-character-setutf8[mysqld]port 3306ch…...
四川省乐山市建设银行网站/百度指数查询官方下载
在写xml文件的时候,需要注意有5个特殊的字符,分别是: &<>“’ 。如果在文件中需要写入这5个字符的时候,需要转换处理。常用处理方式有转义字符和CDATA。 转义字符 在 XML 中有 5 个预定义的实体引用: <&l…...
如何做h5简历制作网站/搜索引擎大全入口
Method Swizzling 原理 在Objective-C中调用一个方法,其实是向一个对象发送消息,即查找消息的唯一依据是selector的名字。每一个SEL都对应着其方法实现真实的运行地址(IMP)。 如下图: Method Swizzling 可以使得两个SEL所对应的IM…...
wordpress兼容php版本/做电商必备的几个软件
【XAML文档的树形结构】 UI在用户眼里面是个平面结构。如下图所示,在用户眼里看来,这个界面就是一个窗体里面平铺了4个文本框和一个按钮的界面。 在传统的Visual C、Delphi、Visual Basic6.0和Windows Form程序员的思维里,UI也是一个平面的结…...