SQL:Normalization(范式化)

目录

Normalization(范式化)

为什么需要 Normalization?

🧩 表格分析:

第一范式(1NF) 

 什么是第一范式(First Normal Form)?

 第二范式(2NF)

 什么是第二范式(2NF)?

怎么规范化成 2NF?

 第三范式(3NF)

什么是第三范式(3NF)?

当前表违反 3NF 的原因:

规范化为3NF 

Normalization(范式化)

为什么需要 Normalization?

目的:

  1. 减少数据冗余(重复)

  2. 避免数据不一致

  3. 提高数据完整性

  4. 简化维护(插入、更新、删除)

🧩 表格分析:

原始表(未规范化):

StudentYearClassTeacher
John Smith9GeographyMr. Green
Tom Buchanan9GeographyMr. Green
Sarah Bennet8PhysicsMrs. Einstein
Charlie Brown9GeographyMr. Green
April Barnes10MusicMrs. Sharpe

这个表的问题:

  • “Geography - Mr. Green” 重复了 3 次。

  • 如果某天 Mr. Green 改名了,需要修改所有相关记录 → 数据一致性风险

  • 如果 Geography 班级没有学生,无法记录老师信息 → 数据不完整

第一范式(1NF) 

 什么是第一范式(First Normal Form)?

  • 字段中不能有多个值(必须是原子值)

  • 字段名不应重复(如 Class1, Class2)

  • 每一行记录应代表一个唯一实体的单一信息单位

StudentYearClass
Paul Dawson11Math
Peggy Mitchell10History
Paul Dawson11Math
Brian Cox8English, Chemistry
Linda Marsh7Math, History, Biology

❌ 为什么这个表不满足第一范式(1NF)?

  1. 字段“Class”不是原子值(存在多个值组合成一个字段):

    • Brian Cox 的 Class 是 “English, Chemistry”(包含多个课程)

    • Linda Marsh 的 Class 是 “Math, History, Biology”

    • 这违反了 1NF 的“每个字段必须只包含一个值”的规则。

  2. 存在重复行(Paul Dawson 出现了两次,内容完全一样)。

 规范化后的学生信息表

💡 拆解多值字段 → 变为多行,每行只包含一个原子值

学生姓名(Student)年级(Year)课程(Class)
Paul Dawson11Math
Peggy Mitchell10History
Paul Dawson11Math
Brian Cox8English
Brian Cox8Chemistry
Linda Marsh7Math
Linda Marsh7History
Linda Marsh7Biology

 第二范式(2NF)

 什么是第二范式(2NF)?

2NF 的定义: 一个表满足 2NF,要求它首先是 1NF,且不能有任何“非主属性”对主键的部分依赖。 

通俗讲:

  • 如果主键是复合主键(比如由 Student, Subject 组成),

  • 那么其他字段(如 Age) 必须依赖于整个主键,而不能只依赖主键的一部分。

❌ 看看这个表的问题在哪:

StudentSubjectGradeAge
Natasha WilliamsMathsA15
Natasha WilliamsEnglishB15
Daniel JamesMathsC16
Simon BrownChemistryA14
Emma ThomasGeographyB14
  • Grade 依赖于整个 (Student + Subject),这是 OK 的 

  • Age 只依赖于 Student,不依赖 Subject  → 部分依赖!

怎么规范化成 2NF?

我们要“消除部分依赖” → 拆成两个表让每张表中,非主属性都完全依赖主键。

表一:成绩表(以 Student + Subject 为主键) 

StudentSubjectGrade
Natasha WilliamsMathsA
Natasha WilliamsEnglishB
Daniel JamesMathsC
Simon BrownChemistryA
Emma ThomasGeographyB

表二:学生基本信息表(以 Student 为主键) 

StudentAge
Natasha Williams15
Daniel James16
Simon Brown14
Emma Thomas14
  • 主键:Student

  • 非主属性:Age

  • Age 完全依赖于 Student,符合第二范式 ✅

 第三范式(3NF)

什么是第三范式(3NF)?

一个关系模式满足 3NF,需要:

  1. 满足 2NF;

  2. 所有非主属性 必须直接依赖主键,不能依赖其他非主属性(即消除传递依赖)。

原始表:

SubjectYearStar PupilStar Pupil Date Of Birth
Math2015Matthew Taylor1999-03-21
Physics2015William Edwards1999-09-15
Chemistry2015Georgina Simon1998-11-04
Math2016Benjamin Long2000-05-02
Physics2016William Edwards1999-09-15

当前表违反 3NF 的原因:

  • 主键候选是 (Subject, Year)

  • Star Pupil 是依赖于 (Subject, Year)

  • 但是 Star Pupil Date Of Birth 是依赖于 Star Pupil ❌ → 传递依赖存在

规范化为3NF 

表一:课程之星表 

主键:Subject + Year,非主键:Star Pupil)

SubjectYearStar Pupil
Math2015Matthew Taylor
Physics2015William Edwards
Chemistry2015Georgina Simon
Math2016Benjamin Long
Physics2016William Edwards

表二:学生信息表 

(主键:Star Pupil,非主键:Date of Birth)

Star PupilDate of Birth
Matthew Taylor1999-03-21
William Edwards1999-09-15
Georgina Simon1998-11-04
Benjamin Long2000-05-02

通过拆分:

  • 我们将“课程→之星学生”和“学生→出生日期”的两种关系分离;

  • 保证每个非主属性直接依赖其所属表的主键;

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

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

相关文章

#MES系统运维问题分析思路

一套适用于90% MES运维现场问题的排查分析思维模型,叫做: 🔍 MES系统问题分析七步法(现场实战适用) ✅ 第一步:明确问题现象(What) 问题要说清楚,“不能操作”这种模糊描…

达梦数据库-学习-18-ODBC数据源配置(Linux)

一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存4G逻辑核数2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…

js 效果展示 拿去练手

自学完整功能,拿去练手。 鼠标移动放大 通过网盘分享的文件:图片放大 链接: https://pan.baidu.com/s/1w8SjtKi4kUNDnZtRDfYMeQ?pwd95p6 提取码: 95p6 通过网盘分享的文件:图片动画效果 链接: https://pan.baidu.com/s/1Pjphx-Cc4HQQNNujr…

使用 TFIDF+分类器 范式进行企业级文本分类(二)

1.开场白 上一期讲了 TF-IDF 的底层原理,简单讲了一下它可以将文本转为向量形式,并搭配相应分类器做文本分类,且即便如今的企业实践中也十分常见。详情请见我的上一篇文章 从One-Hot到TF-IDF(点我跳转) 光说不练假把…

硬件设计-MOS管快速关断的原因和原理

目录 简介: 来源: MOS管快关的原理 先简单介绍下快关的原理: 同电阻时为什么关断时间会更长 小结 简介: 本章主要介绍MOS快速关断的原理和原因。 来源: 有人会问,会什么要求快速关断,而…

Linux进阶命令

目录 一、touch 1. 基本语法 2. 常用选项 二、which 1. 基本语法 2. 主要功能 3. 常用选项 三、find 1. 基本语法 2. 常用选项和表达式 四、more 1. 基本语法 2. 常用操作 3. 对比 more 和 less 五、grep 1. 基本语法 2. 常用选项 六、wc 1. 基本语法 2. 常…

阿里云实时计算Flink版产品体验测评

阿里云实时计算Flink版产品体验测评 什么是阿里云实时计算Flink应用场景实时计算Flink&自建Flink集群性价比开发效率运维管理企业安全 场景落地 什么是阿里云实时计算Flink 实时计算Flink大家可能并不陌生,在实时数据处理上,可能会有所接触&#xf…

用户登录不上linux服务器

一般出现这种问题,重新用root用户修改lsy用户的密码即可登录,但是当修改了还是登录不了的时候,去修改一个文件用root才能修改, 然后在最后添加上改用户的名字,例如 原本是只有user的,现在我加上了lsy了&a…

Android Jetpack架构组件——用Compose工具包构建基本的布局

推荐文章 构建基本布局 | Android Basics Compose - First Android app | Android Developers 向 Android 应用添加图片 | Android Developers

SLAM(七)-卡尔曼滤波

SLAM(七)-卡尔曼滤波 一、卡尔曼滤波(KF)二、扩展卡尔曼滤波(EKF)三、误差状态卡尔曼滤波(ESKF) 参考《概率机器人》、《Principles of GNSS,lnertial and Multisensor lntegrated Navigation Systems (Second Edition)》 一、卡尔曼滤波(KF)…

Electron 应用太重?试试 PakePlus 轻装上阵

Electron 作为将 Web 技术带入桌面应用领域的先驱框架,让无数开发者能够使用熟悉的 HTML、CSS 和 JavaScript 构建跨平台应用。然而,随着应用规模的扩大,Electron 应用的性能问题逐渐显现——内存占用高、启动速度慢、安装包体积庞大&#xf…

Vue.js组件安全工程化演进:从防御体系构建到安全性能融合

——百万级流量场景下的安全组件架构与源码级解决方案 文章目录 总起:安全工程化的组件革命 分论: 一、现存组件架构的七宗罪与安全改造路径   1.1 组件生态安全赤字现状   1.2 架构级安全缺陷深度剖析   1.3 性能与安全的死亡螺旋 二、百万级…

MCP+cursor使用嘴操作数据库(不用编写SQL语句实现CURD)

文章目录 1.如何进行相关配置2.如何添加MCP server3.如何进行相关的操作3.0数据的查询3.1数据的插入3.2数据的修改3.3多表连接查询 1.如何进行相关配置 这个跟昨天的高德地图的配置非常的相似,因此这个地方我就不进行过多的这个说明了,就是新加一个全聚…

效率工具- git rebase 全解

一、前言 对于git rebase 一直不太了解,这几天想着提高下git提交质量,就发现了这个好用的指令,顺便记录一下,好加深记忆 贴出官方文档以便大家进一步学习 Git 二、rebase是作用 rebase 官方解释为变基,可以理解为移动你的分支根节点,维护一个更好的提交记录。rebase把你当前…

小爱音箱接入大模型DeepSeek及TTS

简介 相信看过钢铁侠的朋友们,都梦想拥有一个像贾维斯这样全能的人工智能管家。而现在随着AI的发展,这个愿景将随我们越来越近。现阶段,我们可以将小爱音箱接入DeepSeek,将其从“人工智障”进化成上知天文,下懂地理的半…

软件架构评估利器:质量效用树全解析

质量效用树是软件架构评估中的一种重要工具,它有助于系统地分析和评估软件架构在满足各种质量属性方面的表现。以下是关于质量效用树的详细介绍: 一、定义与作用 质量效用树是一种以树形结构来表示软件质量属性及其相关效用的模型。它将软件的质量目标…

[IEEE TIP 2024](cv即插即用模块分享)IdeNet信息增强模块 性能提升必备!

论文地址:https://ieeexplore.ieee.org/document/10661228 代码地址:https://github.com/whyandbecause/IdeNet 什么是伪装目标检测(COD)? 伪装目标检测(Camouflaged Object Detection, COD)是…

biblatex 的 Biber 警告​​:tex文件运行无法生成参考文献和目录

原因​​:使用了 biblatex 管理参考文献,但未运行 biber 生成参考文献数据。 ​​解决​​:更新 LaTeX Workshop 配置 修改你的 settings.json,添加 biber 工具并更新编译流程: {"latex-workshop.latex.tools&…

thingsboard3.9.1编译问题处理

问题1: [ERROR] Failed to execute goal org.thingsboard:gradle-maven-plugin:1.0.12:invoke (default) on project http: Execution default of goal org.thingsboard:gradle-maven-plugin:1.0.12:invoke failed: Plugin org.thingsboard:gradle-maven-plugin:1.…

深入浅出Redis 缓存使用问题 | 长文分享

目录 数据一致性 先更新缓存,后更新数据库【一般不考虑】 先更新数据库,再更新缓存【一般不考虑】 先删除缓存,后更新数据库 先更新数据库,后删除缓存【推荐】 怎么选择这些方案?采用哪种合适? 缓存…