当前位置: 首页 > news >正文

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

通过拆分:

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

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

相关文章:

  • 豪越赋能消防安全管控,解锁一体化内管“安全密码”
  • 07_Z-Stack多节点组网及终端消息上报
  • 《Python星球日记》第26天:Matplotlib 可视化
  • SEER: Self-Aligned Evidence Extraction for Retrieval-AugmentedGeneration
  • SQL 查询中涉及的表及其作用说明
  • docker compose方式安装ClickHouse数据库
  • 工会考试重点内容有哪些:核心考点与备考指南
  • 软考-数据库系统工程师(15万词+400张图片)(一)
  • SFM/MVS_NERF_3DGAUSS三维重建
  • linux内核升级
  • 行业案例 | SAS 基于 SQL 托管实例构建高弹性安全的数据平台
  • 低频rfid手持机,助力动物耳标智能化管理
  • 管理大规模监控技术栈的最佳实践
  • 【数据结构与算法】包装类初识泛型
  • 拓扑排序 —— 2. 力扣刷题207. 课程表
  • 14.1 - VDMA彩条显示实验之固定分辨率
  • 【Javascript】在canvas中加载shader着色器的方法(开箱即用)
  • 102.二叉树的层序遍历- 力扣(LeetCode)
  • JavaScript Number 对象
  • Unity中使用FMETP STREAM传输实时画面
  • 北京最大做网站的公司/seo短期培训班
  • 腾度网站建设专家/百度推广怎么做的
  • html5手机网站模板 下载/活动推广文案
  • web网站开发源代码/seo教学免费课程霸屏
  • 凉山彝族自治州网站建站/友情链接多久有效果
  • 不会技术怎么做公司网站/店面怎么做位置定位