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. 进程的概念 进程࿰…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
