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小肖MySQL3100

上面这个表可以用学号跟课程作为复合主键来确定同学当前选修课的成绩。
学生的姓名跟课程没有关系,也就是说学生的姓名只依赖于学号,不依赖于课程。
学分与学号没有关系,也就是说学分依赖于课程,不依赖于学号。
对于由两个或者多个关键字段决定一条记录的情况,如果一行数据中有些字段只与关键字段中的一个有关系,那么这种就说她存在部分函数依赖
如果有这样子的情况就说明这个表不满足第二范式。

学生选修课的成绩表:

学号学生姓名课程学分成绩
1小肖MySQL3100
2小王MySQL390
3小强JAVA280
4小苏JAVA285

不满足第二范式会出现的问题(看上表):
1.数据冗余:
学生姓名、课程、学分都重复出现,造成了大量的数据冗余。
2.更新异常:
如果需要调整JAVA的学分,那么就需要更新所有记录关于JAVA的记录,如果一旦某些记录更新成功,某些更新失败,就会造成数据中某一课程学分不一致的情况,表现为数据不一致。
3.插入异常:
(学校新开了一门课,已经定义好了学分,但是学校里面没有任何关于这门课的记录)目前这样的设计,每一门课与同学的考试是对应关系,只有同学进行考试之后才会生成一条关于这门课的成绩记录,这条记录保存了课程的学分,也就是说在学生考试之前在数据库中是没有相应记录的,因为插入的课程信息如果学生的成绩记录为空,没有学生会愿意看到他的成绩是空的,所以是没有意义的,这就是插入异常。
4.删除异常
学生毕业之后,把毕业的同学考试记录全部都删除之后,删除记录的同时,也可能把课程对应的学分全部删除,导致一段时间内,数据库中没有课程和学分的相关信息。

2.3第三范式(3NF)

在第二范式的基础上,不存在非关键字段,对任一候选键的传递依赖。
两个强相关关系存在传递现象,这种传递关系称为传递依赖。比如学生表中拿到学号,可以根据学号拿到学校,根据学校又可以拿到学院等信息。

反例:
学生表:

学号学生姓名学院学院地址学院电话
2023小肖信科院中国1069

因为现在要描述的是一个学生表,所以可以看出来学号是一个主键。
在这个表中学生姓名跟学号具有强关系,学院地址跟学院电话是与学院强相关的。
可以看出来,这条记录中出现了两种强相关关系,这两个强相关关系存在传递现象
学生姓名–>学号–>学院–>学院地址–>学院电话
这样的一个传递关系,称为传递依赖,这种设置不满足第三范式,因为存在传递依赖。
正例
根据学生与与学院的关系,拆分成两个表即可。
学生表:

学号学生姓名学生年龄学院编号
2023小肖200052

学院表:

学院编号学院地址学院电话
0052长沙0735

在这里插入图片描述

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

在这里插入图片描述
欧耶!!!我学会啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54351.shtml

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

相关文章

嘴尚绝卤味:健康美味的双重奏

在当今快节奏的生活中,人们对美食的追求不再仅仅停留于味蕾的满足,更加注重食物的健康与营养。在这一背景下,"嘴尚绝卤味"以其独特的健康理念与精湛的制作工艺,成为了市场上备受瞩目的卤味品牌。本文将从"嘴尚绝卤…

Kotlin基本知识

Kotlin是一种现代的静态类型编程语言,由JetBrains公司在2010年推出,并被Google在2019年宣布为Android开发的首选语言。 超过 50% 的专业 Android 开发者使用 Kotlin 作为主要语言,而只有 30% 使用 Java 作为主要语言。 70% 以 Kotlin 为主要语…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑光伏不确定性的配电网谐波监测优化配置方法 》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Azure DevOps Server:不能指派新增的用户

Contents 1. 概述2. 解决方案 1. 概述 近期和微软Azure DevOps项目组解决了一个“无法指派开发人员”的问题,在此分享给大家。问题描述: 在一个数据量比较大的Azure DevOps Server的部署环境中,用户发现将新用户的AD域账户添加到Azure DevOps…

《15分钟轻松学 Python》教程目录

为什么要写这个教程呢,主要是因为即使是AI技术突起的时代,想要用好AI做开发,那肯定离不开Python,就算最轻量级的智能体都有代码块要写,所以不一定要掌握完完整整的Python,只要掌握基础就能应对大部分场景。…

数据看板如何提升决策效率?

数据看板作为一种直观、高效的数据可视化工具,在这一过程中发挥着至关重要的作用。以一家中型制造企业为例,每天面临着生产计划的安排、原材料的采购、产品质量的把控以及市场销售的策略制定等诸多业务场景。在生产线上,需要确保设备的高效运…

【隐私计算篇】多方安全计算之函数秘密共享(FSS)

1. 函数秘密共享(FSS)定义 秘密共享是一种将一个值拆分为多个份额的方法,形式有多种,可以参考《安全多方计算(MPC)矩阵乘法算子的原理分析》。这里主要提及加法秘密共享,使得:这些份额可以重新组合以还原出秘密值;任…

【HTML并不简单】笔记1-常用rel总结:nofollow、noopener、opener、noreferrer,relList

文章目录 rel"nofollow"rel"noopener"与rel"opener"rel"noreferrer"relList对象 《HTML并不简单:Web前端开发精进秘籍》张鑫旭,一些摘要: HTML,这门语言的知识体系非常庞杂,涉…

Python数据结构与算法问题详解

Python数据结构与算法问题详解 Python 作为一种高级编程语言,凭借其简洁的语法和强大的内置库,成为了数据结构与算法学习的绝佳工具。本文将深入解析几种常见的数据结构,并结合具体的算法,展示如何在实际问题中高效解决问题。通过…

《PMI-PBA认证与商业分析实战精析》第7章 解决方案评价

第7章 解决方案评价 本章主要内容: 评价的建议思维 解决方案的评价计划 确定评价什么 何时以及如何验证解决方案的结果 评价验收标准和解决缺陷 促进通过/不通过的决策 获得解决方案的签字确认 评价解决方案的长期绩效 解决方案替换/淘汰 本章涵盖的考试…

ASP.NET Core 创建使用异步队列

示例图 在 ASP.NET Core 应用程序中,执行耗时任务而不阻塞线程的一种有效方法是使用异步队列。在本文中,我们将探讨如何使用 .NET Core 和 C# 创建队列结构以及如何使用此队列异步执行操作。 步骤 1:创建 EmailMessage 类 首先&#xff0c…

1、Spring Boot 3.x 集成 Eureka Server/Client

一、前言 基于 Spring Boot 3.x 版本开发,因为 Spring Boot 3.x 暂时没有正式发布,所以很少有 Spring Boot 3.x 开发的项目,自己也很想了踩踩坑,看看 Spring Boot 3.x 与 2.x 有什么区别。自己与记录一下在 Spring Boot 3.x 过程…

Linux下的IO模型

阻塞与非阻塞IO(Input/Output) 阻塞与非阻塞IO(Input/Output)是计算机操作系统中两种不同的文件或网络通信方式。它们的主要区别在于程序在等待IO操作完成时的行为。 阻塞IO(Blocking IO) 在阻塞IO模式下…

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…

PyGWalker:让你的Pandas数据可视化更简单,快速创建数据可视化网站

1、PyGWalker应用: 在数据分析的过程中,数据的探索和可视化是至关重要的环节,如何高效地将分析结果展示给团队、客户,甚至是公众,是很多数据分析师和开发者面临的挑战,接下来介绍的两大工具组合——PyGWalker与Streamlit,可以帮助用户轻松解决这个问题,即使没有复杂的代…

调用智谱AI,面试小助手Flask简单示例

文章目录 1.接入AI获取API密钥Python代码 2.小助手的实现流程3.Flask应用示例Python文件.pyindex.html运行Flask应用地址栏输入 http://localhost:5000/ 1.接入AI 获取API密钥 在智谱AI的官方网站上注册,右上角点击API密钥,新建并复制一个 API Key&…

AI不可尽信

看到某项目有类似这样的一段代码 leaves : make([]int, 10) leaves leaves[:0]没理解这样的连续两行,有何作用? 初始化一个长度和容量都为10的切片,接着把切片长度设置为0 即如下demo: (在线地址) package mainimport "fmt"func main() {leaves : make([]int, 1…

MongoDB-aggregate流式计算:带条件的关联查询使用案例分析

在数据库的查询中,是一定会遇到表关联查询的。当两张大表关联时,时常会遇到性能和资源问题。这篇文章就是用一个例子来分享MongoDB带条件的关联查询发挥的作用。 假设工作环境中有两张MongoDB集合:SC_DATA(学生基本信息集合&…

Flask-2

文章目录 请求全局钩子[hook]异常抛出和捕获异常abort 主动抛出HTTP异常errorhandler 捕获错误 context请求上下文(request context)应用上下文(application context)current_appg变量 两者区别: 终端脚本命令flask1.0的终端命令使用自定义终端命令 flask2.0的终端命…

⌈ 传知代码 ⌋ 将一致性正则化用于弱监督学习

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…