sql专题 之 三大范式
文章目录
- 背景
- 范式介绍
- 第一范式:属性不可再分
- 第二范式
- 第三范式
- 注意事项
- 为什么不遵循后续的范式
- 数据库范式在实际应用中会遇到哪些挑战?
背景
- 数据库的范式(Normal Form)是一组规则,用于设计数据库表结构以 减少数据冗余 和 提高数据完整性
- 范式的概念最早由埃德加·科德(Edgar F. Codd)提出,他是关系型数据库之父。
- 范式是一系列的 设计规则
从第一范式到更高的范式(如第二范式2NF、第三范式3NF、Boyce-Codd范式(BCNF)、第四范式4NF、第五范式NF等)。
每个层次都建立在前一个层次的基础上,进一步消除数据冗余和依赖关系。 - 范式虽然分为多个级别,但最常用的是前三个范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)
范式介绍
接下来我们会用一个学生信息存储表来举例来了解一下三大范式的规则。
这张表需存储:学生学号、学生姓名、考试分数、分数等级、考试科目、手机号码 信息。
- 初始表格 【表_0】 如下:
第一范式:属性不可再分
First Normal Form,但是通常我们用“1NF”来表示
- 定义
如果一个表符合第一范式,么这个表中的每个字段都必须包含单一值,而不能是数组或者集合。
即表中的每个属性都是原子的,不可再分割 - 特点
- 所有列的值都不可再分割,且没有重复的列
- 每行都是唯一的
- 示例解析
【表_0】中,score列存储了分数和分数等级两个数据。
- 缺点:
- (1)如果需要求学生的总分时,还需要对数据进行切割,损耗了性能
- (2)如果需要等级A的学生的总数时,只能进行模糊查询,损耗率性能
- (3)不能按照分数或者分数等级进行分组排序
- 优化:
- 将分数和等级拆分成 score 和 score_level 两个字段。优化结果如下【表_1】
- 将分数和等级拆分成 score 和 score_level 两个字段。优化结果如下【表_1】
第二范式
Second Normal Form,但是通常我们用“2NF”来表示
- 定义
在满足第一范式的基础上,消除部分依赖。
即,每个非主属性必须依赖于整个主键,而不能仅依赖于部分主键 - 特点
1、第二范式一定是第一范式,第一范式是基础
2、非主属性不能依赖部分属性(没懂不要急,马上就要解释了) - 示例解释
- 【表_1】中,学号(sno)+学科(subject)可以唯一的确定一列。所以【sno+subject】为主键。
但是学生姓名(sname) 和 电话号码(phone)确是只依赖于sno存在的。
- 【表_1】中,学号(sno)+学科(subject)可以唯一的确定一列。所以【sno+subject】为主键。
- 缺点:
- 数据产生了大量的冗余数据,会增加查询的耗时,也会增加数据一致性的维护成本
假如学生有十门考试成绩,那么就会存储十份电话号码。
如果某一个数据出现了不一致的情况,就会不确定正确的数据是哪个了
- 数据产生了大量的冗余数据,会增加查询的耗时,也会增加数据一致性的维护成本
- 优化:我们对表进行拆分成【个人信息表】 和【考试成绩表】
第三范式
Thrid Normal Form,但是通常我们用“3NF”来表示
- 定义
在满足第二范式的基础上,消除传递依赖,即非主属性不能依赖于其他非主属性
- 特点
所有非主属性都直接依赖于主键,而不能依赖于其他非主属性
- 示例解释
在上边的学生信息表中,score_level的取值依赖于score的值。
如果 score >= 90,那么 score_level=“A”;
如果71<= score <= 89,那么 score_level=“B”;
如果 score <= 70,那么 score_level=“C”; - 优化:将score_level拆分出来成一个等级表,且该等级表不会改变
(这里数字太多,我们就只写上边出现的数字吧)
这里举例用分数不太恰当,感受不出第三范式的简洁来。
我们可以这么理解,在公司中的员工考核,评价A+\A\A-,等级均为A;评价B+\B\B-,等级均为B;
评价C+\C\C-,等级均为C;
然后我们在等级表中,就只需要存储9条信息就可以了。对比与将考核等级仅满足第二范式,这样可以更清楚的了解等级的划分标准。
注意事项
- 虽然三大范式是数据库的基本原则,但是在实际情况中也需要根据实际项目情况进行取舍,不要过度追求规范化
过度规范化可能会导致数据表数量增多、关系变得更加复杂,从而增加查询和维护的难度
- 如果是大数据量,如表里数据有2000w+,查询时需要关联多张表才能取到完整的数据,造成性能瓶颈。这时候我们可以在表中适当的冗余(用空间换时间~)
- 所以,在设计数据库时需要根据实际需求进行灵活调整。
为什么不遵循后续的范式
- 在实际应用中,数据库的设计并不需要达到BCNF级别,更不用说4NF\5NF。
- 1、随着范式的提高,数据库的设计变得更复杂也更难维护
- 2、高范式可能导致更多的连表查询,影响数据库的性能
- 3、虽然存在更多范式,但实际中1NF、2NF、3NF常被提及和使用
(虽然我们大学也学高数,但实际生活中买东西,我们并不需要去求导~😏😏😏)
数据库范式在实际应用中会遇到哪些挑战?
- 1、设计复杂度高
高范式的设计意味着更多的表和更复杂的表关系,增加了数据库的设计和理解难度
- 2、性能下降
高范式下查询因为要多表连接,会导效率下降,尤其在大数据和高并发访问的场景下尤为明显。
- 3、存储空间更大
因为数据不断拆分为多个表,会占用更多的存储空间
- 4、数据一致性的维护
在更改一个数据时,需要确保相关表中的数据都得更新
- 5、插入、更新、删除异常
在非常严格范式的要求下,如果要增加一条数据,需要先检查多个表。在更新或者删除时,也可能因为依赖关系而更新或者删除不成功
- 6、数据冗余
有时为了提升效率而故意引入冗余数据
相关文章:

sql专题 之 三大范式
文章目录 背景范式介绍第一范式:属性不可再分第二范式第三范式注意事项 为什么不遵循后续的范式数据库范式在实际应用中会遇到哪些挑战? 背景 数据库的范式(Normal Form)是一组规则,用于设计数据库表结构以 减少数据冗…...
node.js安装和配置教程
软件介绍 Node.js是一个免费的、开源的、跨平台的JavaScript运行时环境,允许开发人员在浏览器之外编写命令行工具和服务器端脚本。 Node.js是一个基于Chrome JavaScript运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Goo…...

定时器输入捕获实验配置
首先,第一个时基工作参数配置 HAL_TIM_IC_Init( ) 还是一样的套路,传参是一个句柄,先定义一个结构体 Instance:指向TIM_TypeDef的指针,表示定时器的实例。TIM_TypeDef是一个包含了定时器寄存器的结构体,用…...

【C/C++】memcpy函数的使用
零.导言 当我们学习了strcpy和strncpy函数后,也许会疑惑整形数组要如何拷贝,而今天我将讲解的memcpy函数便可以拷贝整形数组。 一.memcpy函数的使用 memcpy函数是一种C语言内存函数,可以按字节拷贝任意类型的数组,比如整形数组。 …...
spring-security(两种权限控制方式)
案例(写死的用户密码) package com.zking.security.service;import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.User; import org.sp…...

【mongodb】数据库的安装及连接初始化简明手册
NoSQL(NoSQL Not Only SQL ),意即"不仅仅是SQL"。 在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 通过应用实践证明,关系模型是非常适合于客户服务器…...
【科普】卷积、卷积核、池化、激活函数、全连接分别是什么?有什么用?
概念定义作用/用途解释举例卷积 (Convolution)是一种数学操作,通过在输入数据(如图片)上滑动卷积核,计算局部区域的加权和。提取数据中的局部特征,例如边缘、角点等。卷积就像在图片上滑动一个小的窗口,计算…...
距离向量路由选择协议和链路状态路由选择协议介绍
距离向量路由选择协议(Distance Vector Routing Protocol)和链路状态路由选择协议(Link-State Routing Protocol)是两种主要的网关协议,它们用于在网络内部选择数据传输的最佳路径。下面分别介绍这两种协议:…...

【AI大模型】大型语言模型LLM基础概览:技术原理、发展历程与未来展望
目录 🍔 大语言模型 (LLM) 背景 🍔 语言模型 (Language Model, LM) 2.1 基于规则和统计的语言模型(N-gram) 2.2 神经网络语言模型 2.3 基于Transformer的预训练语言模型 2.4 大语言模型 🍔 语言模型的评估指标 …...

ubuntu 22.04 server 安装 和 初始化 LTS
ubuntu 22.04 server 安装 和 初始化 下载地址 https://releases.ubuntu.com/jammy/ 使用的镜像是 ubuntu-22.04.5-live-server-amd64.iso usb 启动盘制作工具 https://rufus.ie/zh/ rufus-4.6p.exe 需要主板 支持 UEFI 启动 Ubuntu22.04.4-server安装 流程 https://b…...
大数据机器学习算法与计算机视觉应用03:数据流
Data Stream Streaming ModelExample Streaming QuestionsHeavy HittersAlgorithm 1: For Majority elementMisra Gries AlgorithmApplicationsApproximation of count Streaming Model 数据流模型 数据流就是所有的数据先后到达,而不是同时存储在内存之中。在现…...

【代码随想录day25】【C++复健】491.递增子序列;46.全排列;47.全排列 II;51. N皇后;37. 解数独
491.递增子序列 本题做的时候除了去重逻辑之外,其他的也勉强算是写出来了,不过还是有问题的,总结如下: 1 本题的关键:去重 与其说是不知道用什么去重,更应该说是完全没想到本题需要去重,说明…...

AI智能识物(微信小程序)
AI智能识物,是一款实用的小程序。可以拍照智能识物,可识别地标、车型、花卉、植物、动物、果蔬、货币、红酒、食材等等,AI智能技术识别准确度高。 更新说明: 此源码为1.2.0版本。 主要更新内容:新增security.imgSec…...

游戏引擎学习第三天
视频参考:https://www.bilibili.com/video/BV1XTmqYSEtm/ 之前的程序不能退出,下面写关闭窗体的操作 PostQuitMessage 是 Windows API 中的一个函数,用于向当前线程的消息队列发送一个退出消息。其作用是请求应用程序退出消息循环,通常用于处…...

帝国CMS7.5仿模板堂柒喜模板建站网 素材资源下载站源码
环境要求:phpmysql、支付伪静态 本套模板采用帝国cms7.5版UTF-8开发,一款非常不错的高端建站源码模板, 适用于中小型网络建站工作室源码模板下载站,支持自定义设置会员组。 源码下载:https://download.csdn.net/down…...

聊一聊Spring中的自定义监听器
前言 通过一个简单的自定义的监听器,从源码的角度分一下Spring中监听的整个过程,分析监听的作用。 一、自定义监听案例 1.1定义事件 package com.lazy.snail;import lombok.Getter; import org.springframework.context.ApplicationEvent;/*** Class…...
【王木头】最大似然估计、最大后验估计
目录 一、最大似然估计(MLE) 二、最大后验估计(MAP) 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时,MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频: 贝叶斯解释“L1和L2正则化”ÿ…...

智谱AI视频生成模型CogVideoX v1.5开源 支持5/10秒视频生成
今日,智谱技术团队发布了其最新的视频生成模型 CogVideoX v1.5,并将其开源。这一版本是自8月以来,智谱技术团队推出的 CogVideoX 系列中的又一重要进展。 据了解,此次更新大幅提升了视频生成能力,包括支持5秒和10秒的视…...

算法(第一周)
一周周五,总结一下本周的算法学习,从本周开始重新学习许久未见的算法,当然不同于大一时使用的 C 语言以及做过的简单题,现在是每天一题 C 和 JavaScript(还在学,目前只写了一题) 题单是代码随想…...
Linux服务器进程的控制与进程之间的关系
在 Linux 服务器中,进程控制和进程之间的关系是系统管理的一个重要方面。理解进程的生命周期、控制以及它们之间的父子关系对于系统管理员来说至关重要。以下是关于进程控制、进程之间的关系以及如何管理进程的详细介绍: 1. 进程的概念 进程࿰…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...