詳解數據庫范式

范式

  • 1. 第一范式(1NF)
  • 2. 第二范式(2NF)
  • 3. 第三范式(3NF)
  • 4. BC范式(BCNF,Boyce-Codd Normal Form)
  • 5. 第四范式(4NF)
  • 6. 第五范式(5NF)
  • 總結:

在數據庫設計中, 范式(Normal Forms, NFs)是一種用于規范化數據庫結構的理論,用以消除數據冗余、提高數據一致性,同時減少異常問題。范式的核心思想是將數據劃分成更小、更獨立的表,并通過關系(外鍵)進行連接。

1. 第一范式(1NF)

目標:確保每列的值是原子值。

  • 要求:

    • 數據庫表中的每一列只包含單一值(原子性)。
    • 不允許一列存儲多個值(如數組、列表等),也不允許嵌套表。
  • 示例:不符合1NF

    學生ID姓名聯系方式
    1張三12345, 67890
    2李四98765

    上述表中“聯系方式”列包含了多個值,因此不符合1NF。

  • 改進(符合1NF)

    學生ID姓名聯系方式
    1張三12345
    1張三67890
    2李四98765

2. 第二范式(2NF)

目標:消除非主屬性對主鍵的部分依賴。

  • 要求:

    • 滿足1NF。
    • 表中的每一個非主屬性必須完全依賴于主鍵,而不能只依賴于主鍵的一部分(解決部分依賴)。
  • 示例:不符合2NF

    學生ID課程ID課程名稱成績
    1C001數學90
    1C002英語85

    假設主鍵是(學生ID, 課程ID)的組合,“課程名稱”只依賴于課程ID,而不是組合主鍵,因此違反2NF。

  • 改進(分表,符合2NF)

    • 課程表:

      課程ID課程名稱
      C001數學
      C002英語
    • 成績表:

      學生ID課程ID成績
      1C00190
      1C00285

3. 第三范式(3NF)

目標:消除非主屬性之間的傳遞依賴。

  • 要求:

    • 滿足2NF。
    • 非主屬性之間不存在傳遞依賴(即非主屬性不能依賴于另一個非主屬性)。
  • 示例:不符合3NF

    學生ID系ID系名稱
    1CS001計算機系
    2EE002電氣工程系

    在此表中,“系名稱”依賴于“系ID”,“系ID”又依賴于主鍵“學生ID”,這是一種傳遞依賴。

  • 改進(分表,符合3NF)

    • 學生表:

      學生ID系ID
      1CS001
      2EE002
    • 系表:

      系ID系名稱
      CS001計算機系
      EE002電氣工程系

4. BC范式(BCNF,Boyce-Codd Normal Form)

目標:消除主屬性間的依賴關系。

  • 要求:

    • 滿足3NF。
    • 對于每一個函數依賴 X → Y X \to Y XY X X X 必須是超鍵。(超鍵是一個或多個屬性的組合,這些屬性的值可以唯一地標識表中的每一行記錄。換句話說,一個超鍵中的值是足夠獨特的,它能夠用來區分表中的任意兩條記錄。)
  • 示例:不符合BCNF

    教師ID課程名稱教室
    T001數學R101
    T002英語R102

    假設(教師ID, 課程名稱)為主鍵,“教室”依賴于“課程名稱”,“課程名稱”不是超鍵,因此違反BCNF。

  • 改進(分表)

    • 課程表:

      課程名稱教室
      數學R101
      英語R102
    • 教師課程表:

      教師ID課程名稱
      T001數學
      T002英語

5. 第四范式(4NF)

目標:消除多值依賴。

  • 要求:

    • 滿足BCNF。
    • 表中不能存在非主屬性的多值依賴。
  • 示例:不符合4NF

    學生ID語言愛好
    1英語籃球
    1英語足球
    1法語籃球
    1法語足球

    上述表中,“語言”和“愛好”是獨立的多值屬性,存在多值依賴。

  • 改進(分表)

    • 學生語言表:

      學生ID語言
      1英語
      1法語
    • 學生愛好表:

      學生ID愛好
      1籃球
      1足球

6. 第五范式(5NF)

目標:消除連接依賴。

  • 要求:
    • 滿足4NF。
    • 表中每一個關系都應該能夠通過其更小的關系表連接復原(避免連接依賴)。

總結:

范式目標主要特點
1NF消除重復組,保證每列值原子性。每列只存儲單一值。
2NF消除部分依賴,非主屬性完全依賴主鍵。必須完全依賴主鍵,不允許部分依賴。
3NF消除傳遞依賴,非主屬性只依賴主鍵。非主屬性之間不能存在依賴關系。
BCNF消除主屬性間依賴,所有函數依賴的決定因素為超鍵。更嚴格的3NF。
4NF消除多值依賴,每個關系只存儲一個獨立主題。解決多值屬性獨立的問題。
5NF消除連接依賴,確保關系可以通過小表復原。對復雜表分解到極致。

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

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

相關文章

一窺DeepSeek開源EPLB項目:揭開技術背后的面紗

摘要 在DeepSeek開源DualPipe項目的同一天,EPLB項目也正式對外公開。EPLB(Enhanced Pipeline Balancing)并非一蹴而就的奇跡,而是經過長時間的研發與優化。該項目旨在通過改進管道平衡機制,提升系統的穩定性和效率。本…

Unity進階課程【二】Mask 組件的使用 UI遮罩效果以及透明摳圖效果

Unity組件講解 Mask 時隔多年,今天咱們繼續進階課程,這幾年變化很大,但是一直還是從事Unity行業,行業雖難,依舊堅持,以后會養成習慣,定期更新,希望小伙伴們監督,有想學習…

汽車無鑰匙啟動系統不使用傳統機械鑰匙啟動汽車

汽車無鑰匙啟動系統 定義 汽車無鑰匙啟動系統(Keyless Start System),啟動車輛時不用掏擰鑰匙,只需把鑰匙放在包內或口袋里,按下車內按鍵或擰動導板即可使發動機點火。它無需插入鑰匙,通過點按按鍵或旋轉…

Webpack 和 Vite 的主要區別

Webpack 和 Vite 的主要區別,從構建機制、開發體驗、生產優化等多個維度進行對比: 1. 構建機制與速度 Webpack 全量打包:啟動時必須分析所有模塊依賴關系,進行全量打包,生成 Bundle 文件。項目越大,冷啟動時…

【Python】Python 3.11安裝教程

一、Python 3.11安裝包下載 1. Python 3.11下載與安裝 Download Python | Python.org 下載完成包含以下文件: 二、python3.11安裝步驟 1.右鍵以管理員身份運行安裝程序。 2.勾選【Add Python…】然后點擊【Customize…】。 3.頁面點擊【Next】。 4.勾選【Install …

如何處理PHP中的編碼問題

如何處理PHP中的編碼問題 在PHP開發過程中,編碼問題是一個常見且棘手的問題。無論是處理用戶輸入、數據庫交互,還是與外部API通信,編碼問題都可能導致數據亂碼、解析錯誤甚至安全漏洞。本文將深入探討PHP中的編碼問題,并提供一些…

【畢業論文格式】word分頁符后的標題段前間距消失

文章目錄 【問題描述】 分頁符之后的段落開頭,明明設置了標題有段前段后間距,但是沒有顯示間距: 【解決辦法】 選中標題,選擇邊框 3. 選擇段前間距,1~31磅的一個數 結果

【實戰ES】實戰 Elasticsearch:快速上手與深度實踐-附錄-3-從ES 7.x到8.x的平滑遷移策略

👉 點擊關注不迷路 👉 點擊關注不迷路 👉 點擊關注不迷路 附錄-版本升級指南 3-Elasticsearch 7.x 到 8.x 平滑遷移策略指南1. 升級必要性分析1.1 版本特性對比1.2 兼容性評估矩陣 2. 預升級準備清單2.1 環境檢查表2.2 數據備份策略 3. 分階段…

Android,Java,Kotlin 確保線程順序執行的多種實現方式

在多線程編程中,有時需要確保一個線程必須等待另一個線程執行完畢后再執行。本文將介紹幾種常見的方法來實現這一需求,并提供詳細的代碼示例。 1. 使用 Thread.join() Thread.join() 是最簡單直接的方法,它會讓當前線程等待目標線程執行完畢…

論文調研 | 一些開源的AI代碼生成模型調研及總結【更新于250313】

本文主要介紹主流代碼生成模型,總結了基于代碼生成的大語言模型,按照時間順序排列。 在了解代碼大語言模型之前,需要了解代碼相關子任務 代碼生成 文本生成代碼(Text to code):根據自然語言描述生成代碼 重構代碼(Refactoring …

【QT】-一文說清楚QT定時器怎么用

在 Qt 中,定時器(QTimer)是用來定時執行某些任務的非常有用的類。它可以幫助你在指定的時間間隔后重復執行某個函數。常見的用法是啟動一個定時器,每過一段時間自動執行某個操作,比如更新 UI、檢查狀態或發送數據等。 …

iOS OC匹配多個文字修改顏色和字號

1、傳入字符串數組&#xff0c;通過NSMutableAttributedString修改匹配文字 可以根據需要搞成匹配單個字符串 - (NSAttributedString *)applyFontSizeToText:(NSString *)text matchStrings:(NSArray<NSString *> *)matchStrings {NSMutableAttributedString *attribut…

3DS模擬器使用(pc+安卓)+金手指+存檔互傳

1、引言 3ds模擬器已經能夠在手機端近乎完美模擬了&#xff0c;那么多的3ds游戲&#xff0c;比玩手機游戲舒服多了。 本人是精靈寶可夢的老玩家&#xff0c;從第一世代就一直在玩&#xff0c;剛耍完NDS的第五世代&#xff0c;黑白系列。現在到寶可夢XY了&#xff0c;需要在3d…

Java EE Web環境安裝

Java EE Web環境安裝 一、JDK安裝與測試&#xff08;Windows環境&#xff09; 1. 安裝JDK 官網下載&#xff1a;Oracle JDK&#xff08;選擇Windows x64 Installer&#xff09;雙擊安裝包&#xff0c;按向導完成安裝 ? 2. 環境變量配置 右鍵【此電腦】→【屬性】→【高級…

探索CSS魔法:3D翻轉與漸變光效的結合

隨著前端技術的不斷發展&#xff0c;CSS不再僅僅局限于樣式設計&#xff0c;它也成為了實現富有互動性的動畫和特效的強大工具。本篇文章將向大家展示如何利用CSS的3D變換和漸變光效&#xff0c;打造一張“神秘卡片”&#xff0c;通過簡單的代碼實現炫酷的視覺效果。 1. 初識神…

C++ STL 深度解析:vector 的全面指南與進階技巧

一、底層架構深度剖析 1.1 內存管理機制 vector 通過三個指針實現動態內存管理&#xff1a; _start&#xff1a;指向分配內存的首元素&#xff08;begin()返回值&#xff09;_finish&#xff1a;指向最后一個元素的下一個位置&#xff08;end()返回值&#xff09;_end_of_st…

pom.xml中配置的repository,在編譯器下載依賴包沒生效,怎么解決

針對 pom.xml 中配置的倉庫&#xff08;repository&#xff09;未生效導致依賴下載失敗的問題&#xff0c;結合搜索結果和 Maven 依賴解析機制&#xff0c;以下是分步解決方案&#xff1a; 一、問題原因分析 鏡像覆蓋全局請求 若 settings.xml 中配置了鏡像&#xff08;mirror…

S7-1200 G2移植舊版本S7-1200程序的具體方法示例

S7-1200 G2移植舊版本S7-1200程序的具體方法示例 前期概要: S7-1200 G2必須基于TIA博途V20,之前的程序可通過移植的方式在新硬件上使用。 該移植工具可自動將TIA Portal 項目從 S7-1200 移植到更新的S7-1200 G2。 注意: 該插件支持在同一TIA Portal項目實例內將軟件和/或硬…

CNN SSP, ASPP, PPM 分割任務經典尺度聚合模塊

SSP&#xff1a;Spatial Pyramid Pooling 讓任意大小圖像最終輸出的特征維度始終固定&#xff0c;便于接全鏈接層。 4x4, 2x2,1x1區域的maxpooling&#xff0c;讓任意大小圖像最終輸出最終特征維度始終為 &#xff08;1641)*256 ASSP:Atrous Spatial Pyramid Pooling 不進行…

OpenHarmony-XTS測試

OpenHarmony-XTS測試 OpenHarmony-XTS測試環境搭建測試準備開始運行PS OpenHarmony-XTS測試 針對OpenHarmony版本進行XTS測試使用記錄。 windows環境。 以acts套件為例。 環境搭建 獲取測試套件&#xff0c;兩種方法 1&#xff09;官網下載&#xff1a;https://www.openharm…