數據庫的規范化設計方法---3種范式

第一范式(1NF):確保表中的每個字段都是不可分割的基本數據項。
第二范式(2NF):在滿足1NF的基礎上,確保非主屬性完全依賴于主鍵。
第三范式(3NF):在滿足2NF的基礎上,確保非主屬性不傳遞依賴于主鍵。

使用 StudentCourse 表作為基礎,來解釋第一范式(1NF)。

第一范式 (1NF) 的核心要求:
確保表中的每一個單元格(字段值)都包含單一、不可再分割的基本數據項。換句話說,表中的每一列都必須是原子性的,不能包含多個值或復合值。
回顧之前的 StudentCourse 表:

StudentID (學號)StudentName (姓名)StudentDepartment (系別)CourseID (課程號)CourseName (課程名)Professor (教授)
1001張三計算機系CS101數據結構李教授
1001張三計算機系CS201數據庫原理王教授
1002李四電子系EE101電路基礎趙教授
1003王五計算機系CS101數據結構李教授
1003王五計算機系CS301操作系統劉教授

分析 StudentCourse 表是否滿足 1NF:
現在我們來逐一檢查這個表中的每一列,看看它們是否都滿足原子性(不可分割)的要求:

  1. StudentID (學號): 例如 “1001”。這是一個單一的數值,不能再分割成更小的有意義的部分(比如不能把它分成 ‘1’, ‘0’, ‘0’, ‘1’ 并認為每個都有獨立意義)。滿足 1NF。
  2. StudentName (姓名): 例如 “張三”。雖然姓名可以拆分成姓氏和名字(“張” 和 “三”),但在數據庫設計中,通常將整個姓名視為一個不可分割的字符串來處理,特別是當我們不需要單獨查詢姓氏或名字時。如果業務上需要單獨處理姓氏和名字,才需要拆分成兩列。通常認為滿足 1NF。
  3. StudentDepartment (系別): 例如 “計算機系”。這是一個單一的文本值,表示一個系別。滿足 1NF。
  4. CourseID (課程號): 例如 “CS101”。這是一個單一的標識符,不能再分割。滿足 1NF。
  5. CourseName (課程名): 例如 “數據結構”。這是一個單一的文本值。滿足 1NF。
  6. Professor (教授): 例如 “李教授”。這是一個單一的文本值。滿足 1NF。
    結論: 在這個例子中,StudentCourse 表的每一列都只包含單一、不可分割的數據項。因此,這個表滿足第一范式 (1NF)
    一個不滿足 1NF 的例子:
    假設我們有一個 StudentInfo 表,其中存儲了學生的聯系電話,但允許一個學生有多個電話:
StudentIDStudentNamePhoneNumbers
1001張三13812345678, 13987654321
1002李四13700001111
1003王五13611112222, 13833334444, 13955556666

在這個表中,PhoneNumbers 列包含了多個電話號碼,用逗號分隔。這違反了 1NF,因為該列的單元格包含了多個基本數據項(多個電話號碼)。
要使其滿足 1NF,我們需要將每個電話號碼放在單獨的一行,或者創建一個單獨的 StudentPhone 表。
希望這個例子能幫助你理解第一范式的要求!

好的,我們來通過具體的例子來解釋“完全依賴”和“不傳遞依賴”這兩個概念,它們是第二范式(2NF)和第三范式(3NF)的核心。
假設我們有一個存儲學生選修課程信息的表:
表:StudentCourse (學生選課表)

StudentID (學號)StudentName (姓名)StudentDepartment (系別)CourseID (課程號)CourseName (課程名)Professor (教授)
1001張三計算機系CS101數據結構李教授
1001張三計算機系CS201數據庫原理王教授
1002李四電子系EE101電路基礎趙教授
1003王五計算機系CS101數據結構李教授
1003王五計算機系CS301操作系統劉教授

這個表的主鍵是 (StudentID, CourseID),因為一個學生可以選多門課,一門課可以被多個學生選,只有同時知道學號和課程號才能唯一確定一行記錄。

2. 第二范式 (2NF) - 完全依賴 (Full Dependency)

定義: 在滿足第一范式(1NF)的基礎上,非主屬性必須完全依賴于整個主鍵,而不僅僅是主鍵的一部分。
問題: 如果主鍵是由多個屬性組成的(復合主鍵),我們需要檢查每個非主屬性是否依賴于所有主鍵屬性。
在 StudentCourse 表中:

  • 主鍵: (StudentID, CourseID)
  • 非主屬性: StudentName, StudentDepartment, CourseName, Professor
    現在我們檢查每個非主屬性是否完全依賴于 (StudentID, CourseID)
  1. StudentName (姓名): 姓名是由學號 StudentID 決定的,和選了哪門課 CourseID 無關。所以 StudentName 依賴于 StudentID,而不是 (StudentID, CourseID)。這叫部分依賴 (Partial Dependency)
  2. StudentDepartment (系別): 系別也是由學號 StudentID 決定的,和課程號 CourseID 無關。所以 StudentDepartment 依賴于 StudentID,而不是 (StudentID, CourseID)。這也是部分依賴
  3. CourseName (課程名): 課程名是由課程號 CourseID 決定的,和學生的學號 StudentID 無關。所以 CourseName 依賴于 CourseID,而不是 (StudentID, CourseID)。這同樣是部分依賴
  4. Professor (教授): 教授通常是由課程號 CourseID 決定的(假設一門課只有一個固定教授),和學生的學號 StudentID 無關。所以 Professor 依賴于 CourseID,而不是 (StudentID, CourseID)。這也是部分依賴
    結論: StudentCourse 表不滿足 2NF,因為存在非主屬性(StudentName, StudentDepartment, CourseName, Professor)部分依賴于主鍵 (StudentID, CourseID) 的子集(要么只依賴 StudentID,要么只依賴 CourseID)。
    如何修正 (分解): 我們需要將表分解,使得每個表的非主屬性都完全依賴于該表的主鍵。
  • Student (學生表): 主鍵 StudentID
    StudentID (學號)StudentName (姓名)StudentDepartment (系別)
    1001張三計算機系
    1002李四電子系
    1003王五計算機系
  • Course (課程表): 主鍵 CourseID
    CourseID (課程號)CourseName (課程名)Professor (教授)
    CS101數據結構李教授
    CS201數據庫原理王教授
    EE101電路基礎趙教授
    CS301操作系統劉教授
  • StudentSC (學生選課關系表): 主鍵 (StudentID, CourseID)
    StudentID (學號)CourseID (課程號)
    1001CS101
    1001CS201
    1002EE101
    1003CS101
    1003CS301

現在檢查這些新表:

  • Student 表的主鍵是 StudentID,所有非主屬性 (StudentName, StudentDepartment) 都完全依賴于 StudentID
  • Course 表的主鍵是 CourseID,所有非主屬性 (CourseName, Professor) 都完全依賴于 CourseID
  • StudentSC 表的主鍵是 (StudentID, CourseID),它沒有其他非主屬性,所以自然滿足。
    這些分解后的表都滿足了 2NF。

3. 第三范式 (3NF) - 不傳遞依賴 (No Transitive Dependency)

定義: 在滿足第二范式(2NF)的基礎上,非主屬性必須不傳遞依賴于主鍵。也就是說,非主屬性不能依賴于另一個非主屬性。
問題: 我們需要檢查是否存在“主鍵 -> 非主屬性 A -> 非主屬性 B”這樣的依賴鏈條,其中 B 就是傳遞依賴于主鍵。
在修正后的 Student 表中:

  • 主鍵: StudentID
  • 非主屬性: StudentName, StudentDepartment
    檢查是否存在傳遞依賴:
  • StudentID -> StudentDepartment (學號決定系別)
  • StudentDepartment -> ? 這個系別 (StudentDepartment) 是否又決定了其他的非主屬性?在我們的 Student 表中,系別只決定了它自己,沒有決定其他非主屬性 (StudentName)。所以沒有傳遞依賴。
    在修正后的 Course 表中:
  • 主鍵: CourseID
  • 非主屬性: CourseName, Professor
    檢查是否存在傳遞依賴:
  • CourseID -> Professor (課程號決定教授)
  • Professor -> ? 這個教授 (Professor) 是否又決定了其他的非主屬性?在我們的 Course 表中,教授只決定了它自己,沒有決定其他非主屬性 (CourseName)。所以沒有傳遞依賴。
    假設我們有一個不滿足 3NF 的表:
    表:StudentDept (學生系別表 - 假設大學有系主任)
StudentID (學號)StudentName (姓名)StudentDepartment (系別)DepartmentHead (系主任)
1001張三計算機系陳主任
1002李四電子系吳主任
1003王五計算機系陳主任
  • 主鍵: StudentID (假設學號唯一)
  • 非主屬性: StudentName, StudentDepartment, DepartmentHead
    檢查依賴關系:
  1. StudentID -> StudentName (滿足)
  2. StudentID -> StudentDepartment (滿足)
  3. StudentID -> DepartmentHead ? 不完全是。學號本身不直接決定系主任。但是,我們可以通過學號找到系別 (StudentID -> StudentDepartment),然后通過系別找到系主任 (StudentDepartment -> DepartmentHead)。所以,DepartmentHead傳遞依賴于主鍵 StudentID 的。StudentID -> StudentDepartment -> DepartmentHead
    結論: StudentDept 表不滿足 3NF,因為存在非主屬性 DepartmentHead 傳遞依賴于主鍵 StudentID
    如何修正 (分解): 我們需要將傳遞依賴的非主屬性分離出來。
  • Student (學生表): 主鍵 StudentID
  • StudentID (學號)StudentName (姓名)StudentDepartment (系別)
    1001張三計算機系
    1002李四電子系
    1003王五計算機系
  • Department (系別表): 主鍵 StudentDepartment (可以用系別名稱或系編號作為主鍵,這里簡化用名稱)
    StudentDepartment (系別)DepartmentHead (系主任)
    計算機系陳主任
    電子系吳主任

現在檢查這些新表:

  • Student 表滿足 3NF。
  • Department 表的主鍵是 StudentDepartment,唯一的非主屬性 DepartmentHead 完全依賴于它,并且沒有其他非主屬性可以依賴,所以也滿足 3NF。

總結:

  • 完全依賴 (2NF): 非主屬性不能只依賴于復合主鍵的“一部分”。它們必須依賴于整個主鍵。
  • 不傳遞依賴 (3NF): 非主屬性不能依賴于另一個非主屬性。它們必須直接依賴于主鍵,不能通過中間的非主屬性間接依賴。
    通過滿足這些范式,可以減少數據冗余,避免數據更新異常(插入、刪除、修改異常)。

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

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

相關文章

產品經理入門(2)產品體驗報告

產品體驗報告大綱:重點在產品體驗——優點。 1.產品概括 可以從各大平臺搜產品介紹。 2.市場分析 按照產品方向分析各個指標——包括有效使用時間,市場規模等。 3. 用戶分析——對用戶通過各項指標畫像。 4.產品體驗——對各項功能與設計的體驗。 5.報告總結

[Java][Leetcode simple] 13. 羅馬數字轉整數

一、自己想的 只有提到的六種情況是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虛擬機上配置靜態 IP 地址并保持重啟后 SSH 連接

在使用 CentOS 7 的虛擬機時&#xff0c;我們通常需要配置靜態 IP 地址&#xff0c;以確保在每次虛擬機重啟后能夠通過 SSH 連接。本文將介紹如何在 CentOS 7 系統中配置靜態 IP 地址&#xff0c;并確保配置在系統重啟后依然生效。 步驟 1&#xff1a;檢查虛擬機網絡接口 首先…

matlab求解問題

一、目的 掌握Matlab中函數求導、函數極值和極限問題的求解,能夠借助Matlab工具對簡單優化模型進行求解。 二、內容與設計思想 1、函數求導 1.1求解給定函數的一階導數&#xff1a;diff(y, x)用于對變量x求y的導數。 1.2求解給定函數的二階導數&#xff1a;在求出一階導數的…

C語言斐波那契數列

斐波那契數列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又稱黃金分割數列 、兔子數列。由意大利數學家萊昂納多?斐波那契在 1202 年提出&#xff0c;源于其《算盤書》中一道兔子繁殖問題。定義&#xff1a;在數學上&#xff0c;該數列以遞歸形式定義。最常見的是…

AI浪潮:開啟科技新紀元

AI 的多面應用? AI 的影響力早已突破實驗室的圍墻&#xff0c;在眾多領域落地生根&#xff0c;成為推動行業變革的重要力量。 在醫療領域&#xff0c;AI 宛如一位不知疲倦的助手&#xff0c;助力醫生提升診療效率與準確性。通過對海量醫學影像的深度學習&#xff0c;AI 能夠快…

Ansys 計算剛柔耦合矩陣系數

Ansys 計算剛柔耦合系數矩陣 文章目錄 Ansys 計算剛柔耦合系數矩陣衛星的剛柔耦合動力學模型采用 ANSYS 的 APDL 語言的計算方法系統轉動慣量的求解方法參考文獻 衛星的剛柔耦合動力學模型 柔性航天器的剛柔耦合動力學模型可以表示為 m v ˙ B t r a n η F J ω ˙ ω J…

算法題(148):排座椅

審題&#xff1a; 本題需要我們找到最佳的排座椅方案&#xff0c;并輸出行&#xff0c;列方案 思路&#xff1a; 方法一&#xff1a;簡單貪心 由于題目會告訴我們有哪幾對的同學會交頭接耳&#xff0c;所以我們可以記錄下第幾行/第幾列上可以隔開的同學對數&#xff0c;而題目限…

企業級電商數據對接:1688 商品詳情 API 接口開發與優化實踐

在數字化浪潮席卷全球的當下&#xff0c;企業級電商平臺之間的數據對接已成為提升運營效率、增強市場競爭力的關鍵環節。作為國內知名的 B2B 電商平臺&#xff0c;1688 擁有海量商品資源&#xff0c;通過開發和優化商品詳情 API 接口&#xff0c;企業能夠快速獲取商品信息&…

【Cesium入門教程】第七課:Primitive圖元

Cesium豐富的空間數據可視化API分為兩部分&#xff1a;primitive API面向三維圖形開發者&#xff0c;更底層一些。 Entity API是數據驅動更高級一些。 // entity // 調用方便&#xff0c;封裝完美 // 是基于primitive的封裝// primitive // 更接近底層 // 可以繪制高級圖形 /…

Oracle APEX 必須輸入項目標簽型號顯示位置

1. 正常Oracle APEX中必須輸入項目標簽的紅星顯示在標簽文字左側&#xff0c;偏偏項目要求顯示在右側&#xff0c; 加入如下全局CSS代碼 .t-Form-label {display: flex;flex-direction: row-reverse;gap: 1px; }以上。

深入理解 TypeScript 中的 unknown 類型:安全處理未知數據的最佳實踐

在 TypeScript 的類型體系中&#xff0c;unknown 是一個極具特色的類型。它與 any 看似相似&#xff0c;卻在安全性上有著本質差異。本文將從設計理念、核心特性、使用場景及最佳實踐等方面深入剖析 unknown&#xff0c;幫助開發者在處理動態數據時既能保持靈活性&#xff0c;又…

項目QT+ffmpeg+rtsp(二)——海康威視相機測試

文章目錄 前言一、驗證RTSP地址的有效性1.1 使用VLC播放器驗證1.2 使用FFmpeg命令行驗證1.3 使用Python代碼檢查網絡連接1.4 檢查攝像頭Web界面1.5 使用RTSP客戶端工具二、關于IPV4的地址2.1 原來2.1.1 原因2.2 解決2.3 顯示前言 昨晚拿到一個海康威視的相機,是連接上了交換機…

Java-Collections類高效應用的全面指南

Java-Collections類高效應用的全面指南 前言一、Collections 類概述二、Collections 類的基礎方法2.1 排序操作2.1.1 sort方法2.1.2 reverse方法2.1.3 shuffle方法 2.2 查找與替換操作2.2.1 binarySearch方法2.2.2 max和min方法2.2.3 replaceAll方法 三、Collections 類的高級應…

中國30米年度土地覆蓋數據集及其動態變化(1985-2022年)

中文名稱 中國30米年度土地覆蓋數據集及其動態變化(1985-2022年) 英文名稱&#xff1a;The 30 m annual land cover datasets and its dynamics in China from 1985 to 2022 CSTR:11738.11.NCDC.ZENODO.DB3943.2023 DOI 10.5281/zenodo.8176941 數據共享方式&#xff1a…

Python高版本降低低版本導致python導包異常的問題

當Python從高版本降級到低版本后出現導包異常&#xff0c;通常是由于以下原因導致的&#xff1a;高版本中安裝的包與低版本不兼容、包路徑或依賴沖突、虛擬環境未正確配置等。以下是具體的解決方案和步驟&#xff1a; 1. 確認問題原因 檢查Python版本&#xff1a;確保當前使用…

AGI大模型(20):混合檢索之rank_bm25庫來實現詞法搜索

1 混合檢索簡介 混合搜索結合了兩種檢索信息的方法 詞法搜索 (BM25) :這種傳統方法根據精確的關鍵字匹配來檢索文檔。例如,如果您搜索“cat on the mat”,它將找到包含這些確切單詞的文檔。 基于嵌入的搜索(密集檢索) :這種較新的方法通過比較文檔的語義來檢索文檔。查…

掌握 Kotlin Android 單元測試:MockK 框架深度實踐指南

掌握 Kotlin Android 單元測試&#xff1a;MockK 框架深度實踐指南 在 Android 開發中&#xff0c;單元測試是保障代碼質量的核心手段。但面對復雜的依賴關系和 Kotlin 語言特性&#xff0c;傳統 Mock 框架常顯得力不從心。本文將帶你深入 MockK —— 一款專為 Kotlin 設計的 …

常見平方數和立方數的計算

平方數&#xff08;n&#xff09; 數字計算過程結果1010 101001111 111211212 121441313 131691414 141961515 152251616 162561717 172891818 183241919 193612020 20400 立方數&#xff08;n&#xff09; 數字計算過程結果1010 10 101,0001111 11 111,33112…

自動化測試實戰 - 博客系統自動化測試

目錄 1. 前言 2. 自動化實施步驟 3. 頁面分析 4. 設計測試用例 5. 搭建自動化環境 6. 編寫自動化代碼 6.1 準備工作 - Utils 6.1.1 允許遠程自動化 & 創建驅動 6.1.2 實現自動化截圖 6.1.3 釋放 WebDriver 6.2 自動化測試登錄頁 - LoginTest 6.2.1 打開登陸頁 …