【數據庫干貨】六大范式速記

1NF2NF3NFBCNF4NF5NF都是數據庫設計中的范式(Normalization),用于確保數據庫中的數據結構盡可能地減少冗余,避免更新異常、插入異常、刪除異常等問題,從而提高數據的存儲效率和一致性。
本篇文章簡單講解下各個范式的含義,以及如何快速記住它們。

1. 第一范式(1NF)

定義:一個關系(表)滿足第一范式,意味著表中的每個字段(列)都必須是原子的(atomic)。即每個字段只能包含一個單一的值,而不能是集合、數組或多值。
通俗來說:數據表的每個單元格只能存儲一個值,不能有重復的組或多值字段。
問題:如果數據表不滿足1NF,可能存在列包含多個值的情況,比如一個列存儲多個電話號碼。
例子: 假設有一個“學生課程”表,記錄學生選修的課程。初始狀態可能是這樣的:

學生ID學生姓名選修課程
1張三數學, 英語
2李四物理, 化學

這個表不符合1NF,因為“選修課程”列包含多個值。為滿足1NF,我們需要將每個學生的每一門課程分開:

學生ID學生姓名選修課程
1張三數學
1張三英語
2李四物理
2李四化學

這樣,每個字段都是原子的。

2. 第二范式(2NF)

定義:一個關系(表)滿足第二范式,首先它必須滿足第一范式,并且所有非主屬性(即不是主鍵的屬性)完全依賴于主鍵,而不是部分依賴。也就是說,如果主鍵是由多個列組成的,那么非主屬性必須依賴于整個主鍵,而不能只依賴于主鍵的某一部分。
通俗來說:如果主鍵是復合主鍵(由多個字段組成),那么每個非主鍵字段必須依賴于整個主鍵,而不能只依賴其中的一部分。
問題:如果存在部分依賴,就可能會導致冗余數據。例如,一個復合主鍵的表中,如果有字段只依賴于主鍵的一部分,那么這些字段的重復值就會導致數據冗余。
例子: 繼續考慮“學生課程”表,如果我們加入“教師姓名”字段,這樣的表結構如下:

學生ID課程ID學生姓名選修課程教師姓名
1101張三數學王老師
1102張三英語李老師
2101李四物理王老師
2103李四化學張老師

主鍵是“學生ID”和“課程ID”的組合。在這個例子中,學生姓名和教師姓名都依賴于學生ID和課程ID,但學生姓名只依賴于學生ID,而教師姓名只依賴于課程ID。因此,我們存在部分依賴,表不滿足2NF。
為滿足2NF,我們應該將“學生姓名”單獨提取到一個“學生”表中,將“教師姓名”提取到一個“課程”表中:
學生表:

學生ID學生姓名
1張三
2李四

課程表:

課程ID選修課程教師姓名
101數學王老師
102英語李老師
103化學張老師

學生選課表:

學生ID課程ID
1101
1102
2101
2103

這樣就解決了部分依賴問題,表滿足了2NF。

3. 第三范式(3NF)

定義:一個關系(表)滿足第三范式,首先它必須滿足第二范式,并且每個非主屬性都不傳遞依賴于主鍵。也就是說,非主鍵字段不能依賴于其他非主鍵字段。
通俗來說:如果一個字段依賴于其他非主鍵字段,那么我們就有傳遞依賴。3NF要求消除這種依賴。
問題:傳遞依賴可能會導致冗余數據和數據一致性問題。
例子: 假設我們在“課程表”中添加了“課程時長”字段,并且規定“教師姓名”依賴于“教師工號”,即:

課程ID選修課程教師工號教師姓名課程時長
101數學1王老師40小時
102英語2李老師35小時
103化學3張老師50小時

在這個表中,“教師姓名”依賴于“教師工號”,而“教師工號”又依賴于主鍵(課程ID)。因此,“教師姓名”通過“教師工號”傳遞依賴于課程ID。為了消除這種傳遞依賴,我們需要將“教師工號”和“教師姓名”提取到單獨的“教師”表中:
教師表:

教師工號教師姓名
1王老師
2李老師
3張老師

這樣就消除了傳遞依賴,表滿足了3NF。

4. 巴斯-科德范式(BCNF)

定義:
一個表滿足 BCNF(Boyce-Codd Normal Form)要求滿足以下條件:

  1. 必須滿足 3NF。
  2. 對于每一個函數依賴(A → B),A 必須是候選鍵(candidate key)。也就是說,任何決定其他屬性的字段都必須是候選鍵。
    通俗來說:
  • 在 3NF 中,我們要求沒有傳遞依賴,而 BCNF 要求每個決定其他字段的字段,必須是候選鍵。
  • 候選鍵 是指在沒有其他列可以作為鍵的情況下,可以唯一標識表中一行的列。

為什么需要 BCNF?

3NF 有時不能處理一些更復雜的依賴關系,特別是當表中的某些非主屬性決定了其他非主屬性時,雖然這些屬性滿足了3NF,但卻不能保證表的完美規范化。
BCNF 示例:
假設我們有以下表格,記錄了課程、學生、教師和教室的信息:

課程ID學生ID教師工號教師姓名教室
10111王老師A101
10121王老師A101
10212李老師B201
10232李老師B201
  • 假設 課程ID → 教室(即每門課程對應一個教室),教師工號 → 教師姓名(即每個教師工號對應一個教師姓名),課程ID → 教師工號(即每門課程由一個特定的教師授課)。
    依賴關系:

    • 課程ID → 教室
    • 課程ID → 教師工號
    • 教師工號 → 教師姓名

    從上面的表格來看,我們發現 課程ID 確定了 教室 和 教師工號,但 教師工號 又決定了 教師姓名。這意味著 教師姓名 是由 教師工號 確定的,而 教師工號 不是候選鍵。教師工號 → 教師姓名 的依賴關系違反了 BCNF,因為 教師工號 不是候選鍵。

    解決方案:
    為了使表符合 BCNF,我們需要將表拆分為兩個表:
    1. 課程表:包含課程和教室的信息。
    2. 教師表:包含教師工號和教師姓名的信息。
    3. 選課表:包含學生ID、課程ID和教師工號的信息。

    拆分后的表:

    • 課程表:

      課程ID教室
      101A101
      102B201
    • 教師表:

      教師工號教師姓名
      1王老師
      2李老師
    • 選課表:

      學生ID課程ID教師工號
      11011
      21011
      11022
      31022

通過拆分,教師工號 → 教師姓名 的依賴關系被轉移到 教師表,而不再出現在原始的表中,從而使表符合 BCNF。

5. 第四范式(4NF)

定義:
一個表滿足 第四范式(4NF),要求:

  1. 必須滿足 BCNF。
  2. 表中不存在多值依賴(multivalued dependency)。

多值依賴 是指一個屬性集決定了兩個或多個其他屬性集,但這些屬性集之間沒有關系。例如,一個學生可以同時選修多門課程,并且每個學生有多個興趣愛好,這就構成了多值依賴。
通俗來說:

  • 如果一個表中存在兩組不相關的多值依賴關系,那么表就不符合 4NF。
  • 4NF 的目的是消除由于多值依賴引起的數據冗余。

4NF 示例:
假設有一個表記錄了學生的選修課程和興趣愛好:

學生ID選修課程興趣愛好
1數學籃球
1英語游泳
2物理籃球

在這個表中,學生ID 可以決定 選修課程 和 興趣愛好,但這兩個屬性集是獨立的,即學生選修課程與學生興趣愛好之間沒有直接關系。因此,表格存在 多值依賴,這是不符合 4NF 的。

解決方案:
為了滿足 4NF,我們需要將表拆分為兩個表:

  1. 一個記錄學生和選修課程的表。
  2. 一個記錄學生和興趣愛好的表。

拆分后的表:

  • 學生課程表:

    學生ID選修課程
    1數學
    1英語
    2物理
  • 學生興趣表:

    學生ID興趣愛好
    1籃球
    1游泳
    2籃球

這樣,兩個獨立的多值依賴關系被拆分到不同的表中,消除了冗余數據,符合 4NF。

6. 第五范式(5NF)

定義:
一個表滿足 第五范式(5NF),要求:

  1. 必須滿足 4NF。
  2. 表中不存在任何連接依賴(join dependency)。

連接依賴 是指表中的某些數據不能通過簡單的連接來表示,而是需要一些特殊的處理邏輯來恢復數據。這通常發生在多對多關系中的某些復雜數據模式下。

通俗來說:

  • 5NF 關注的是 連接依賴,要求每個數據表的拆分是合理的,且所有的拆分都應該能夠通過連接操作恢復。
  • 它的主要目的是消除由于復雜多對多關系引起的冗余。

5NF 示例:
假設有一個表記錄了員工、項目和技能的信息:

員工ID項目ID技能
1101編程
1101設計
1102編程
2101設計
2102編程

在這個表中,員工ID、項目ID 和 技能 之間存在復雜的多對多關系。為了保持 5NF,我們需要拆分表格,以便每個表只描述一個單一的多對多關系。
拆分后的表:

  1. 員工項目表:
    員工ID項目ID
    1101
    1102
    2101
    2102
  2. 員工技能表:
    員工ID技能
    1編程
    1設計
    2設計
    2編程
  3. 項目技能表:
    項目ID技能
    101編程
    101設計
    102編程

這樣,表格被拆分后,可以通過連接操作恢復所有數據,且不存在任何連接依賴,符合 5NF。

7. 記憶法

1. 使用簡化的口訣或記憶法

記憶順序:
1NF → 2NF → 3NF → BCNF → 4NF → 5NF

記住每個范式的核心概念及其解決的問題:

  • 1NF:原子性(數據不能重復,必須是單一值)。
  • 2NF:消除部分依賴(每個非主屬性都必須完全依賴于主鍵)。
  • 3NF:消除傳遞依賴(非主屬性不能依賴于其他非主屬性)。
  • BCNF:每個決定因素都是候選鍵(更嚴格的3NF)。
  • 4NF:消除多值依賴(避免兩個不相關屬性集之間的依賴)。
  • 5NF:消除連接依賴(表拆分后可通過連接恢復,避免復雜的連接依賴)。

記憶法:
“原子完全傳遞候選,多值連接" —— 用來記住每個范式的解決問題:

  • 原子:1NF(原子性)
  • 完全:2NF(完全依賴)
  • 傳遞:3NF(傳遞依賴)
  • 候選:BCNF(候選鍵)
  • 多值:4NF(多值依賴)
  • 連接:5NF(連接依賴)

2. 關聯實例,逐步拆解

通過實例化的方式逐步理解和記憶每個范式的含義。先從一個實際的、帶有冗余問題的表開始,逐步通過范式的規范化過程來消除問題。
例如,使用一個簡單的表來說明每個范式:

  • 1NF:學生ID、課程名、教師信息一行一值,不允許多值列。
  • 2NF:從1NF拆解出來,解決了“學生姓名”只依賴“學生ID”這個部分依賴。
  • 3NF:從2NF拆解出來,解決了“教師姓名”通過“教師工號”傳遞依賴的問題。
  • BCNF:更嚴格的要求,消除“教師工號”決定“教師姓名”的問題。
  • 4NF:解決了多個獨立的多值依賴,學生可以選修多個課程,也可以有多個興趣愛好,避免這些屬性混雜在一起。
  • 5NF:消除了復雜的連接依賴,保證了拆分表后能通過連接恢復完整數據。

3. 用簡短問題檢查范式

用一些快速的檢查問題來幫助判斷某個表是否符合某個范式:

  1. 1NF:每個字段是否只有一個值?
  2. 2NF:表是否有復合主鍵,并且非主屬性完全依賴于主鍵?
  3. 3NF:表中是否有非主屬性依賴于其他非主屬性?
  4. BCNF:是否所有決定其他屬性的字段都是候選鍵?
  5. 4NF:是否存在多個獨立的多值依賴?
  6. 5NF:是否所有表的拆分可以通過連接恢復,沒有連接依賴?

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

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

相關文章

Java開發主流框架搭配詳解及學習路線指南

文章目錄一、前言🔗二、主流Java框架搭配2.1 Spring Boot MyBatis-Plus Spring Cloud2.2 Spring Boot Spring Data JPA Spring Cloud2.3 Quarkus/Vert.x (響應式編程棧)三、技術選型建議四、Java學習路線指南階段1:Java基礎 (4-6周)階段2&#xff1a…

flutter-使用device_info_plus獲取手機設備信息完整指南

文章目錄1. 概述2. 安裝與配置3. 基本使用方法3.1. 創建實例3.2. 區分平臺獲取信息4. 詳細信息獲取4.1. Android 設備信息4.2. iOS 設備信息4.3. Web 瀏覽器信息4.4. Windows 設備信息5. 實戰示例6. 注意事項6.1. 權限問題6.2. 隱私保護6.3. 平臺差異處理6.4. 性能考慮7. 常見問…

Java 時間處理 API 全解析:從 JDK7 到 JDK8 的演進

個人主頁-愛因斯晨 友友們,互三咯~ 目錄 個人主頁-愛因斯晨 ?編輯 前言 一、JDK7 時間處理基石 ——Date 類 (一)Date 類基本功能 (二)Date 類的局限性 二、格式化時間好幫手 ——SimpleDateFormat 類 &#…

duiLib 實現鼠標拖動標題欄時,窗口跟著拖動

1、布局文件,窗口需設置可拖動的標題欄區域:2、HandleMessage函數中,處理WM_LBUTTONDOWN消息,判斷鼠標在標題欄,讓系統處理窗口移動。代碼片段如下:else if (uMsg WM_LBUTTONDOWN) {// 獲取鼠標點擊坐標PO…

圖解嵌入式硬件知識庫體系

構建一個嵌入式硬件知識庫體系需要涵蓋嵌入式系統設計、開發和應用的各個方面,內容全面且系統化,適合不同層次的用戶。本文是一個結構化的嵌入式硬件知識庫體系,包含主要內容模塊及其詳細說明。 @startmindmap * 嵌入式硬件知識庫體系 ** 1. 嵌入式系統基礎 *** 概述與定義 …

機器學習的特征工程(特征構造、特征選擇、特征轉換和特征提取)詳解

特征工程是機器學習中至關重要的一步,它直接影響模型的性能和泛化能力。特征構造、特征選擇、特征轉換和特征提取——構成了特征工程的核心流程。下面我來系統地梳理一下它們的定義、方法和應用場景: 整理 by Moshow鄭鍇https://zhengkai.blog.csdn.net/…

Force Dimension觸覺力反饋設備在外科手術機器人遙操作和訓練中的應用

觸覺力反饋設備通過傳感器-執行器-信號處理閉環系統,在外科手術機器人領域實現了從遠程手術操作到虛擬訓練的全流程革新。外科手術機器人外科醫生廣博的專業知識往往受限于他們的主要工具——手。機器人的精確度和靈活性遠遠超過人手。然而,目前機器人還…

【網絡與爬蟲 00】試讀

網絡爬蟲技術全棧指南:從入門到AI時代的數據采集革命 關鍵詞:網絡爬蟲、Python爬蟲、數據采集、反爬技術、分布式爬蟲、AI爬蟲、Scrapy框架、自動化數據提取、爬蟲架構設計 摘要:本專欄是最全面的網絡爬蟲技術指南,涵蓋從基礎框架…

[Chat-LangChain] 前端用戶界面 | 核心交互組件 | 會話流管理

鏈接:https://python.langchain.com/docs/tutorials/qa_chat_history/ Chat-LangChain技術棧 : LangChainLangGraphNext.jsWeaviate (向量存儲)OpenAI (嵌入模型) docs:chat-langchain Chat LangChain 是一個智能聊天機器人,專為解答Lang…

編寫和運行 Playbook

編寫和運行 Playbook Playbook 介紹 adhoc 命令可以作為一次性命令對一組主機運行一項簡單的任務。不過,若要真正發揮Ansible的能力,需要使用功能 playbook。 playbook 是一個文本文件,其中包含由一個或多個按特定順序運行的play組成的列表。…

uniapp手機端video標簽層級過高問題

當我們想以視頻作為背景時,其他dom通過定位顯示在視頻上方,h5頁面上調試發現可以正常使用,效果如下: 當放在手機上看,會發現,僅僅剩一個視頻,本應在視頻上層的元素不見了。 經過一番排查&#x…

【MyBatis批量更新實現】按照list傳入批量更新

學習目標&#xff1a; <update id"updateModelEngineeringSpatialNode" parameterType"com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">update model_engineering_spatial_node<trim prefix"SET" suffixOverrides",&…

VOFA+ 顯示數據、波形

本篇&#xff0c;以最常用的串口通信作展示&#xff0c;示范如何通過VOFA顯示數據波形。 一、VOFA 下載 VOFA 是一款面向嵌入式開發的上位機軟件&#xff0c;專注于硬件數據實時可視化與調試。它通過高效協議&#xff08;如FireWater、JustFloat&#xff09;將原始字節流轉化為…

MySQL 插入數據提示字段超出范圍?一招解決 DECIMAL 類型踩坑

MySQL 插入數據提示字段超出范圍&#xff1f;一招解決 DECIMAL 類型踩坑 在日常數據庫操作中&#xff0c;我們經常會遇到各種字段類型相關的問題。今天就來聊聊一個常見的錯誤&#xff1a;插入數據時提示字段值超出范圍&#xff0c;以實際案例帶你搞懂 MySQL 中 DECIMAL 類型的…

一周學會Matplotlib3 Python 數據可視化-繪制誤差條形圖

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

JVM垃圾回收器

垃圾回收算法標記-復制缺點&#xff1a;內存利用率低&#xff0c;有一塊區域無法使用。標記-清除缺點&#xff1a;1. 效率問題 (如果需要標記的對象太多&#xff0c;效率不高)2. 空間問題&#xff08;標記清除后會產生大量不連續的碎片&#xff09;標記-整理分代收集根據對象存…

科研工具的一些注意事項

Origin Origin導入數據之后&#xff0c;可以考慮 [刪除數據連接器…] 導入數據之后&#xff0c;刪除數據連接&#xff0c;這樣當原來的文件移動之后&#xff0c;就不影響origin文件里面的數據。不然就會出現空白數據&#xff1a;當然&#xff0c;沒有數據了也可以加載出來&…

美國服務器環境下Windows容器工作負載智能彈性伸縮

在北美數據中心加速數字化轉型的今天&#xff0c;企業客戶日益重視Windows容器工作負載的智能化管理。本文將深入探討基于Azure Stack HCI&#xff08;混合云基礎設施&#xff09;的彈性伸縮方案如何突破傳統資源調度瓶頸&#xff0c;通過分析指標收集、策略配置、混合云聯動三…

歐姆龍CP系列以太網通訊實現上位機與觸摸屏監控

一、行業痛點在現代工業生產中&#xff0c;自動化生產線的控制系統的高效性與智能化程度對生產效率和產品質量有著至關重要的影響。然而&#xff0c;許多傳統工業生產線中使用的歐姆龍CP系列系列PLC以太網模塊&#xff0c;由于自身設計原因&#xff0c;并未配備以太網接口&…

【大語言模型 00】導讀

【大語言模型00】導讀&#xff1a;你的LLM全棧工程師進階之路關鍵詞&#xff1a;大語言模型、LLM、Transformer、深度學習、AI工程化、全棧開發、技術路線圖摘要&#xff1a;這是一份完整的大語言模型學習指南&#xff0c;涵蓋從數學基礎到商業落地的200篇深度文章。無論你是AI…