【后端】數據庫四大范式詳細解析

梳理一下 MySQL(或關系型數據庫)中的第一、二、三、四范式,這是數據庫設計中非常重要的規范化理論。


1?? 第一范式 (1NF:First Normal Form)

定義:字段具有原子性,不可再分。

  • 數據表中每一列都必須是不可分割的最小數據單元。

  • 每一行都應該是唯一的(通常通過主鍵來保證)。

? 舉例:
不符合 1NF:

學生表
學號   姓名   聯系方式
1     張三   1380000, 1391111

問題:聯系方式有多個值,違反原子性。

符合 1NF:

學生表
學號   姓名   聯系方式
1     張三   1380000
1     張三   1391111

2?? 第二范式 (2NF:Second Normal Form)

定義:在 1NF 的基礎上,要求每個非主屬性完全依賴于主鍵,不能只依賴主鍵的一部分。

  • 適用于 聯合主鍵 的情況。

  • 消除部分依賴

? 舉例:
不符合 2NF:

選課表
學號+課程號 (聯合主鍵)   姓名   成績
1+001                  張三   95

問題:姓名只依賴學號,而不是依賴于 (學號+課程號) 這個整體主鍵。

符合 2NF(拆表):

學生表
學號   姓名選課表
學號   課程號   成績

3?? 第三范式 (3NF:Third Normal Form)

定義:在 2NF 基礎上,非主屬性不依賴于其他非主屬性(消除傳遞依賴)。

  • 屬性不能依賴于主鍵之外的屬性。

? 舉例:
不符合 3NF:

學生表
學號   姓名   系編號   系名稱

問題:系名稱依賴于系編號,而系編號又依賴學號(學號 → 系編號 → 系名稱,產生傳遞依賴)。

符合 3NF(拆表):

學生表
學號   姓名   系編號系別表
系編號   系名稱

4?? 第四范式 (4NF:Fourth Normal Form)

定義:在 3NF 基礎上,要求多值依賴消除

  • 一張表中不應包含兩個或多個相互獨立的多對多關系。

? 舉例:
不符合 4NF:

學生表
學號   愛好       擅長課程
1     足球       數學
1     足球       英語
1     籃球       數學
1     籃球       英語

問題:愛好與擅長課程之間是獨立的多值依賴,導致大量冗余。

符合 4NF(拆表):

學生_愛好表
學號   愛好學生_課程表
學號   擅長課程

🔑 總結

  • 1NF:字段不可再分(原子性)

  • 2NF:非主屬性完全依賴主鍵(消除部分依賴)

  • 3NF:非主屬性不依賴于其他非主屬性(消除傳遞依賴)

  • 4NF:不允許一個表里有多個獨立的多值依賴

👉 實際開發中:

  • 3NF 已經能滿足大部分場景;

  • 4NF 更偏學術,業務里一般用到 3NF + 適當的反規范化(為了性能)。

👌 那我幫你整理一個 1NF ~ 4NF 對比表,方便快速理解和記憶:


📊 數據庫范式對比表

范式要求典型問題示例(不符合)示例(符合)
第一范式 (1NF)字段必須原子化,不可再分字段中有多個值,違反原子性聯系方式: 1380000, 1391111每條記錄一條聯系方式
第二范式 (2NF)在 1NF 基礎上,非主屬性必須完全依賴主鍵,不能部分依賴聯合主鍵時,非主屬性只依賴其中一部分(學號+課程號) → 姓名將姓名拆到“學生表”
第三范式 (3NF)在 2NF 基礎上,非主屬性不能依賴其他非主屬性(消除傳遞依賴)非主屬性依賴另一個非主屬性學號 → 系編號 → 系名稱把“系編號-系名稱”拆到“系別表”
第四范式 (4NF)在 3NF 基礎上,消除多值依賴(不能同時描述多個獨立的多對多關系)一張表里既存儲“愛好”,又存儲“擅長課程”學號 → 愛好學號 → 擅長課程分成“學生_愛好表”和“學生_課程表”

📌 記憶口訣

  • 1NF:字段原子化

  • 2NF:消除部分依賴

  • 3NF:消除傳遞依賴

  • 4NF:消除多值依賴


畫一個 范式演進示意圖(從 1NF → 4NF,逐步拆表的過程)這樣更直觀。

畫一個 1NF → 4NF 的演進示意圖,用一個「學生」場景,逐步展示規范化的過程:


📝 范式演進示意圖

? 未規范化

學生表
學號 | 姓名 | 聯系方式           | 系名稱  | 愛好   | 擅長課程
1    | 張三 | 1380000,1391111   | 計算機系 | 足球   | 數學

問題:

  • 聯系方式不原子化(違反 1NF)

  • 姓名只依賴學號,不依賴課程號(違反 2NF)

  • 系名稱依賴于系編號,而不是直接依賴學號(違反 3NF)

  • 愛好和課程是獨立的多值依賴(違反 4NF)


? 第一范式 (1NF)

解決字段不可再分 → 拆分聯系方式

學生表
學號 | 姓名 | 聯系方式 | 系編號 | 系名稱 | 愛好 | 擅長課程
1    | 張三 | 1380000  | 01    | 計算機 | 足球 | 數學
1    | 張三 | 1391111  | 01    | 計算機 | 足球 | 數學

? 第二范式 (2NF)

解決部分依賴 → 拆分“學生”和“選課”

學生表
學號 | 姓名 | 系編號選課表
學號 | 課程號 | 成績

? 第三范式 (3NF)

解決傳遞依賴 → 把系名稱單獨拆表

學生表
學號 | 姓名 | 系編號系別表
系編號 | 系名稱選課表
學號 | 課程號 | 成績

? 第四范式 (4NF)

解決多值依賴 → 愛好、擅長課程單獨拆表

學生表
學號 | 姓名 | 系編號系別表
系編號 | 系名稱選課表
學號 | 課程號 | 成績學生_愛好表
學號 | 愛好學生_課程表
學號 | 擅長課程

📌 最終結果

  • 每張表結構更清晰,避免冗余和異常(插入、更新、刪除異常)。

  • 實際項目中常用到 3NF,4NF 更多是學術或復雜業務場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96678.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HarmonyOS后臺任務調度:JobScheduler與WorkManager實戰指南

本文將深入探討HarmonyOS 5(API 12)中的后臺任務調度機制,重點講解JobScheduler和WorkManager的使用方法、適用場景及最佳實踐,幫助開發者實現高效、智能的后臺任務管理。 1. 后臺任務調度概述 HarmonyOS提供了兩種主要的后臺任務…

Prompt工程實踐

你在寫prompt時候,是不是總覺得大模型它不聽話。要么答非所問、要么一堆廢話。扒開思考過程仔細閱讀時而覺得它聰明絕頂,時而又覺得它愚蠢至極。明明已經對了怎么又推理到錯的地方去了,明明在提示詞中提醒過了不要這么思考它怎么就瞎想了。這…

基于springboot的畢業旅游一站式定制系統

博主介紹:java高級開發,從事互聯網行業六年,熟悉各種主流語言,精通java、python、php、爬蟲、web開發,已經做了多年的設計程序開發,開發過上千套設計程序,沒有什么華麗的語言,只有實…

輸入1.8V~5.5V 輸出28V DCDC升壓芯片TLV61046A

今天來一款TI的升壓芯片TLV61046A。輸入電壓范圍1.8V~5.5V。最高可以輸出28V。開關電流980mA,那具體能輸出多大的電流就得看輸入輸出的電壓了。以上面的輸入3.6V輸出12V為例,效率是85%,那最高可以輸出的電流就差不多只有200mA左右。封裝也是非…

ubuntu22.04源碼安裝ffmpeg-4.4

# ubuntu22.04源碼安裝ffmpeg-4.4cd /tmpwget https://ffmpeg.org/releases/ffmpeg-4.4.6.tar.xztar -xvf ffmpeg-4.4.6.tar.xzcd ffmpeg-4.4.6apt updateapt install -y yasm pkg-config libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev libav…

Pyhon中字符串常用的函數

一、字符串的格式化1.format()方法format()是 Python 中用于字符串格式化的方法,通過占位符(如 {})動態插入變量或表達式。name小明 age18 grade99.556245585 information"我是{},今年{}歲了,考試得分:{:.2f}&quo…

小迪安全v2023學習筆記(八十一講)—— 框架安全ThinkPHPLaravelStruts2SpringBootCVE復現

文章目錄前記服務攻防——第八十一天開發框架安全&SpringBoot&Struts2&Laravel&ThinkPHP&CVE復現開發框架 - 常見語言開發框架PHP - 框架安全-Thinkphp&LaravelLaravel漏洞介紹漏洞復現CVE-2021-3129ThinkPHP漏洞介紹漏洞復現CVE-2018-1002015QVD-2022…

從音頻到Token:構建原神角色語音識別模型的完整實踐

本文將帶你從零實現一個基于音頻Token化的角色語音識別系統,完整復現原神角色語音分類任務,包含數據處理、模型訓練和推理全流程。音頻波形通過滑動窗口轉換為數值Token序列的過程 一、為什么需要音頻Token化? 傳統音頻處理通常依賴MFCC、頻譜…

關于TCP和UDP兩種網絡協議的區別

1、tcp協議TCP (Transmission Control Protocol - 傳輸控制協議)TCP 的核心目標是為應用層提供一條可靠的、無差錯的、有序的字節流通道。主要特點:面向連接:在數據傳輸之前,必須通過“三次握手”建立穩定的連接,傳輸結束后通過“…

Alibaba Lens:阿里巴巴推出的 AI 圖像搜索瀏覽器擴展,助力B2B采購

本文轉載自:https://www.hello123.com/alibaba-lens ** 一、🌟 一鍵截圖,輕松找貨:采購神器 Alibaba Lens 詳解 Alibaba Lens 是阿里巴巴集團專為全球 B2B 采購商打造的一款智能瀏覽器插件(支持 Chrome 等主流瀏覽器…

WPF常見問題清單

1.Grid 內容自動換行及自適應行高 <DataGrid Grid.Row"1" FontSize"14" IsReadOnly"True" VerticalScrollBarVisibility"Auto" RowHeight"NaN" ItemsSource"{Binding List}" AutoGenerateColumns"False…

Linux驅動開發筆記(十)——中斷

視頻&#xff1a;第13.1講 Linux中斷實驗-Linux內核中斷框架簡介_嗶哩嗶哩_bilibili 文檔&#xff1a;《【正點原子】I.MX6U嵌入式Linux驅動開發指南V1.81.pdf》五十一章 1. 中斷API函數 每個中斷都有一個中斷號&#xff0c;通過中斷號即可區分不同的中斷。在Linux 內核中使用一…

ubuntu18.04安裝PCL1.14

簡化版說明 1. 安裝依賴庫&#xff1a; (1) boost1.84 &#xff08;https://www.boost.org/releases/1.84.0/&#xff09; tar vxf boost_xxx.tar.gz ./bootstrap.sh --prefix/usr/local/ ./b2 sudo ./b2 install (2) vtk9.1.0 &#xff08;https://vtk.org/files/releas…

python將pdf轉txt,并切割ai

python將pdf轉txt&#xff0c;并切割ai step1:pdf轉換 from PIL import Image import pytesseract import os import tempfile from pdf2image import convert_from_path# 設置 Tesseract 路徑 pytesseract.pytesseract.tesseract_cmd rC:\Users\wangrusheng\AppData\Local\Pr…

Ubuntu22.04更換阿里鏡像源,ubuntu更換源

在 Ubuntu 22.04 上更換為阿里云鏡像源可以加速軟件包的下載和更新&#xff0c;大幅提升系統更新速度。以下是更換阿里云鏡像源的步驟&#xff1a;1. 備份現有源列表在更換鏡像源之前&#xff0c;建議先備份當前的源配置文件&#xff1a;bashsudo cp /etc/apt/sources.list /et…

Git版本控制工具+基礎命令

Git是什么&#xff1f;Git是目前世界上最先進的分布式版本控制系統代碼托管平臺&#xff1a;Gitlab/Github/Gitee&#xff08;碼云&#xff09;什么是版本控制系統&#xff1f;指對軟件開發過程中各種程序代碼、配置文件及說明文檔等文件變更的管理。版本控制最主要的功能就是追…

圖解設計模式【3】

本系列共分為三篇文章&#xff0c;其中包含的設計模式如下表&#xff1a; 名稱設計模式圖解設計模式【1】Iterator、Adapter、Template Method、Factory Method、Singleton、Prototype、 Builder、Abstract Factory、 Bridge、 Strategy圖解設計模式【2】Composite、 Decorato…

(純新手教學)計算機視覺(opencv)實戰十四——模板與多個對象匹配

圖片旋轉、圖片鏡像相關教學&#xff1a; &#xff08;純新手教學&#xff09;計算機視覺&#xff08;opencv&#xff09;實戰十三——圖片旋轉、圖片鏡像 的幾種常用方法-CSDN博客https://blog.csdn.net/2302_78022640/article/details/151356600?spm1011.2415.3001.5331 模板…

Java面試核心知識點總結:Redis與MySQL高可用、高并發解決方案

在分布式系統開發中&#xff0c;高并發場景下的數據一致性、系統可用性以及性能優化始終是核心挑戰。本文基于Java技術棧&#xff0c;結合Redis與MySQL的工程實踐&#xff0c;系統梳理分布式系統設計的關鍵技術要點。一、Redis集群架構演進與高可用實踐1.1 主從哨兵模式部署方案…

R 語言科研繪圖第 72 期 --- mantel檢驗圖

在發表科研論文的過程中&#xff0c;科研繪圖是必不可少的&#xff0c;一張好看的圖形會是文章很大的加分項。 為了便于使用&#xff0c;本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中&#xff0c;獲取方式&#xff1a; R 語言科研繪圖模板 --- sciRplothttps://mp.…