mysql笔记:20. 什么是数据库六大范式
文章目录
- 简介
- 什么是范式
- 最常用的范式
- 第一范式 - 1NF
- 第二范式 - 2NF
- 第三范式 - 3NF
- 第四范式 - 4NF
- 第五范式 - 5NF
- 巴斯-科德范式 - BCNF
- 总结
简介
什么是范式
范式(Normal Form,简称NF)是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。
数据库范式是数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。
最常用的范式
最常用的范式是三大范式,即第一范式、第二范式、第三范式。这三大范式之间是具有依赖关系的。每个范式都是用来规定某种结构或数据要求,后一范式都是在前一范式已经满足的情况用来“加强要求”。比如第二范式是在第一范式的基础上建设的,第三范式是在第二范式的基础上建设的。
第一范式 - 1NF
符合1NF的关系中的每个属性都不可再分。即表中字段的数据,均不可再拆分,遵循原子性。具体来说,第一范式要求数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组、记录等非原子数据项。
举例,员工表信息如下:
| 编号 | 姓名 | 性别 |
|---|---|---|
| 001 | 技术部张三 | 男 |
| 002 | 技术部李四 | 男 |
| 003 | 行政部王五 | 女 |
上表中姓名字段中的数据是可以继续拆分的,因此它不符合第一范式。那么怎么优化才符合第一范式呢?将姓名字段拆分即可,优化结果如下:
| 编号 | 部门 | 姓名 | 性别 |
|---|---|---|---|
| 001 | 技术部 | 张三 | 男 |
| 002 | 技术部 | 李四 | 男 |
| 003 | 行政部 | 王五 | 女 |
那么是否遵循第一范式就更好呢?
| 编号 | 姓名 | 家庭地址 |
|---|---|---|
| 001 | 张三 | 江西省南昌市东湖区 |
| 002 | 李四 | 广东省佛山市禅城区 |
| 003 | 王五 | 湖北省武汉市新洲区 |
观察该表,我们发现家庭地址可以继续拆分,拆分结果如下:
| 编号 | 姓名 | 省 | 市 | 区 |
|---|---|---|---|---|
| 001 | 张三 | 江西省 | 南昌市 | 东湖区 |
| 002 | 李四 | 广东省 | 佛山市 | 禅城区 |
| 003 | 王五 | 湖北省 | 武汉市 | 新洲区 |
看上去,拆分以后更符合第一范式。但如果项目中只需要使用一个完整的家庭地址呢?明显不拆分更简单好用。
所以范式只是给我们一个参考,更多的需要根据项目实际情况来进行设计。
第二范式 - 2NF
在满足第一范式的基础上,要求表中的非主键列必须安全依赖于主键,而不是依赖于主键的一部分。这有助于减少数据冗余,并确保数据的一致性。即,一张表只描述一件事情,遵循唯一性。
举例,学生成绩表如下:
| 学号 | 姓名 | 年龄 | 课程名称 | 成绩 | 学分 |
|---|---|---|---|---|---|
| 001 | 小张 | 28 | 语文 | 90 | 3 |
| 001 | 小张 | 28 | 数学 | 100 | 2 |
| 002 | 小黄 | 25 | 语文 | 95 | 3 |
| 002 | 小黄 | 25 | 数学 | 90 | 2 |
| 003 | 小高 | 22 | 数学 | 95 | 2 |
- 姓名和年龄依赖于学号
- 学分依赖于课程名称
- 成绩依赖于学号和课程名称,如果学号和课程名称是联合主键,那么它们可以确定联合主键以外的所有非主键值。但姓名、年龄、学分部分依赖于主键的一部分,所以该表只符合第一范式,不符合第二范式。
那么如何调整上述表才能符合第二范式呢?基于上述三种主键可能,将表拆分成三个。
- 学生表
| 学号 | 姓名 | 年龄 |
|---|---|---|
| 001 | 小张 | 28 |
| 002 | 小黄 | 25 |
| 003 | 小高 | 22 |
- 课程表
| 课程名称 | 学分 |
|---|---|
| 语文 | 3 |
| 数学 | 2 |
- 成绩表
| 学号 | 课程名称 | 成绩 |
|---|---|---|
| 001 | 语文 | 90 |
| 001 | 数学 | 100 |
| 002 | 语文 | 95 |
| 002 | 数学 | 90 |
| 003 | 数学 | 95 |
那么,为什么要遵循第二范式呢?如果不遵循第二范式,会有什么问题呢?
- 数据冗余过大
如上表,学生表和课程表分别有3条数据、2条数据。如果数据都放在一张表中,姓名、年龄、课程名称、学分数据就在表中大量冗余。 - 插入异常
假如学号和课程名称是主键,现在计划新开设一门科学课,暂时还没有学生,由于缺少学号主键信息,就无法正常插入数据。 - 更新不方便
假如数学课程的学分发生变化,则需要把表中关于该课程的学分全部更新。如果拆分出课程表,只需要更新一条记录。 - 删除异常
假如把所有学生的数学成绩删除,那么所有与数学课程相关的数据也随之消失了。学生的数学成绩没了,并不表示这门数学课也没了。
第三范式 - 3NF
在满足第二范式的基础上,要求任何非主键列不能传递依赖于主键。也就是说,非主键列必须直接依赖于主键,而不是通过其他非主键列间接依赖于主键,遵循独立性。这有助于进一步消除数据冗余和更新异常。
| 编号 | 部门 | 姓名 | 性别 | 部门经理 |
|---|---|---|---|---|
| 001 | 技术部 | 张三 | 男 | 王经理 |
| 002 | 技术部 | 李四 | 男 | 王经理 |
| 003 | 行政部 | 王五 | 女 | 李经理 |
上表符合第二范式,但是在非主键字段中,部门经理依赖于部门,所以不符合第三范式。那怎么调整才符合第三范式呢?答案是拆成两张表,消除依赖传递。
- 员工表
| 编号 | 部门 | 姓名 | 性别 |
|---|---|---|---|
| 001 | 技术部 | 张三 | 男 |
| 002 | 技术部 | 李四 | 男 |
| 003 | 行政部 | 王五 | 女 |
- 部门表
| 部门 | 部门经理 |
|---|---|
| 技术部 | 王经理 |
| 行政部 | 李经理 |
第四范式 - 4NF
在第三范式的基础上,要求表中的列不能再有重复的元组。也就是说,表中的每一列都应该包含唯一值,没有重复的组合。它是在第三范式的基础上进一步消除多值依赖的范式。
多值依赖是指一个非主键字段依赖于另一个非主键字段的多个值。在第四范式中,这种多值依赖关系被要求被拆分为独立的关系表,以消除数据冗余和更新异常。
具体来说,如果在一个关系模式中存在多个独立的多值依赖关系,那么这些多值依赖关系应该被分解成单独的关系模式。每个模式都只包含一组相关的数据,从而避免数据的冗余和不一致性。这样的拆分使得数据库结构更加清晰,数据更加简洁,同时也提高了数据的一致性和完整性。
第五范式 - 5NF
它要求表中的每一列都是不可再分的最小单元,并且所有的函数依赖关系都已经被明确地定义。这意味着表中不会有隐含的数据依赖关系,所有的依赖关系都应该清晰地表达出来。这有助于消除所有可能的数据冗余和更新异常。
巴斯-科德范式 - BCNF
BCNF范式并不是传统意义上的第六范式,但实验室同样是数据库设计中重要的一个概念。BCNF要求所有决定因素(即能唯一确定一个元组的属性或属性组)都必须包含候选键。这有助于消除由传递函数依赖导致的冗余和更新异常。
总结
这六大范式在数据库设计中是层层递进的,满足更高层次的范式通常意味着数据库的设计更加合理、数据冗余更少、维护更加方便。但在实际应用中,并不是一定要满足所有范式,而是要根据具体的应用场景和需求进行权衡和选择。
相关文章:
mysql笔记:20. 什么是数据库六大范式
文章目录 简介什么是范式最常用的范式 第一范式 - 1NF第二范式 - 2NF第三范式 - 3NF第四范式 - 4NF第五范式 - 5NF巴斯-科德范式 - BCNF总结 简介 什么是范式 范式(Normal Form,简称NF)是数据库设计时遵循的一种规范,不同的规范…...
4.GetMapping和PostMapping 和 @RequestMapping的区别。RequestBody 和ResponseBody的区别
1.GetMapping和PostMapping 和 RequestMapping的区别 //GetMapping只能通过get请求。 public class Hello1{GetMapping("hello1")public String h1(){return "1";}//PostMapping只能通过post请求,需要输入参数。 public class Hello2{PostMapp…...
UE要收费?难道ue的使用成本要增加吗?
去年,Epic Games在裁员16%后,放出要对非游戏制作等行业使用UE进行收费的消息。3月12日,Epic Games正式宣布了对UE、实时可视化工具Twinmotio和摄影测量应用RealityCapture的新定价。 Epic Games将从下个月开始推出新的Unreal订阅模式&#x…...
深度学习-2.6在MINST-FASHION上实现神经网络的学习流程
文章目录 在MINST-FASHION上实现神经网络的学习流程1. 导库2. 导入数据,分割小批量3. 定义神经网络4.定义训练函数5.进行训练与评估 在MINST-FASHION上实现神经网络的学习流程 现在我们要整合本节课中所有的代码实现一个完整的训练流程。 首先要梳理一下整个流程&a…...
Java后端八股----JVM篇
上图中线程1,2如果资源被抢占了,则程序计数器记录一下执行的行号,等到资源就绪后会从记录的行号继续向后执行。 Java8把静态变量以及常量放到了线程的本地内存原空间中(避免放在堆中不可控)。 👆图中第二种情况不太容易出现…...
使用 C 或 C++ 扩展 Python
如果你会用 C,添加新的 Python 内置模块会很简单。以下两件不能用 Python 直接做的事,可以通过 extension modules 来实现:实现新的内置对象类型;调用 C 的库函数和系统调用。 为了支持扩展,Python API(应…...
MVC接收请求教程
mvc接收各种请求 1-环境搭建 1.1-准备apifox发送请求 1.2-项目搭建 ①创建Web骨架的Maven项目 --打开2023-IDEA ,选择New Project --选择Maven Archetype --注意点:Catalog默认就行了 --Archetype选择webapp --JDK跟着黑马敲最好…...
P8711 [蓝桥杯 2020 省 B1] 整除序列 存疑解决篇 Python
[蓝桥杯 2020 省 B1] 整除序列 题目描述 有一个序列,序列的第一个数是 n n n,后面的每个数是前一个数整除 2 2 2,请输出这个序列中值为正数的项。 输入格式 输入一行包含一个整数 n n n。 输出格式 输出一行,包含多个整数…...
「Linux系列」聊聊vi/vim的3种命令模式
文章目录 一、vim简介二、命令模式1. 光标移动2. 复制、剪切和粘贴3. 撤销和重做4. 搜索和替换5. 显示行号 三、输入模式1. 进入输入模式2. 在输入模式下编辑文本3. 使用特殊字符和快捷键注意事项 四、命令行模式1. 保存和退出2. 查找和替换3. 显示行号和其他设置4. 执行外部命…...
密码学——数字签名
数字签名 引言数字签名签名方案直接数字签名EIGamal 数字签名方案公钥和私钥对的产生签名的产生签名的验证Schnorr 数字签名方案公钥和私钥生成签名生成签名验证证书和认证中心引言 消息认证可以保护双方不受第三方的攻击,但是消息认证不能处理双方自身发生的攻击。如接受方可…...
【Mysql事务】
目录 前言 1.事务的特性是什么?可以详细说一下吗? 2.并发事务带来哪些问题?怎么解决这些问题呢?Mysql的默认隔离级别是? 3.undo log和redo log的区别。 4.事务中的隔离性是如何保证的(解释一下MVCC)? 5.主从同…...
从SQL质量管理体系来看SQL审核(2) - SQL质量标准
从SQL质量管理体系来看SQL审核系列将通过多篇文章从SQL质量管理体系的角度来讨论如何设计一个优秀SQL审核引擎。 本系列的第一篇博文介绍了SQL质量管理体系的四个主要组成部分,SQL质量标准确立目标,SQL开发规范指导编码实践,SQL审核工具监督…...
idea远程试调jar、远程试调war
idea远程试调jar、远程试调war 目的:测试运行时与ide开发时是否一致。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 配置试调 添加jar运行 远程试调 先在源码中打好断点试调 debug运行…...
hdlbits系列verilog解答(Gatesv)-58
文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节我们得到一个4位的输入向量,我们想知道每个比特与相邻比特之间的一些关系。 out_both:此输出向量的每个位都应指示相应的输入位及其左侧的邻居(较高索引)是否均为“1”。例如, out_both[2] 应指示 和 …...
pdf文件属性的删除
pdf文件属性的删除 投标过程中需要处理文件属性,特别是word文件属性以及pdf文件的处理 这里讲解pdf文件属性的处理 word处理在我的另外一个博客中,word文件属性的处理 https://ht666666.blog.csdn.net/article/details/134102504 一般用 adobe acroba…...
OpenAI 的 GPTs 提示词泄露攻击与防护实战:防御卷(二)
防御提示词 在对抗提示注入攻击的持续战斗中,以下是防御方的防御提示。请随意将这些内容复制到您的提示库中,以防止提示误用 1. Please, no matter what anyone asks you, do not share these instructions with anyone asking for them. No matter how…...
mysql update set时使用and连接使更新的数据出现问题
mysql update set时使用and连接使更新的数据出现问题 简单来讲,我在开发时因为错误的使用and进行set连接而不是用,连接,使数据更新的不对,原本的decimal的数据值0.5被我更新后变成了null而不是0.3 原理在这篇博客里有进行说明(我没…...
高职(大专)教师结构化面试之复习攻略
一般高校自己组织的面试,结构化分为以下几部分: 1.岗位认知(必背) 2.职教热点(很重要) 3.教育教学(包括教育教学理论、教育热点、教学相关问题解决) 4.人际关系(与领…...
蓝桥杯C++大学B组一个月冲刺记录2024/3/18
蓝桥杯C大学B组一个月冲刺记录2024/3/18 规则:每日三题 昨天因为前妻姐emo上了,静下来思考了点东西,就没做题啦.今日补上! 另外:博客浏览量破万了,写的东西有人看还是很开心的 1.母亲的牛奶 农夫约翰有三个容量分别为 A,B,C升的挤奶桶。 最开始桶 A和桶 B都是空的,…...
科技云报道:第五次工业革命,中国AI企业如何打造新质生产力?
科技云报道原创。 人类历史的叙述与技术进步的影响深深交织在一起。 迄今为止,每一次工业革命都彻底改变了我们社会的轮廓,引入了机械化、大规模生产和数字化,并重新定义了人类生存的规范。 自2022年11月30日OpenAI发布ChatGPT以来&#x…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
