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. 进程的概念 进程࿰…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
