軟考架構師:數據庫的范式
😄生命不息,寫作不止
🔥 繼續踏上學習之路,學之分享筆記
👊 總有一天我也能像各位大佬一樣
🏆 博客首頁 ??@怒放吧德德??To記錄領地
🌝分享學習心得,歡迎指正,大家一起學習成長!
🌝AI : Grok
轉發請攜帶作者信息 @怒放吧德德 @一個有夢有戲的人
問題 1:數據庫的范式
提問:
數據庫的范式
一、AI 講解
數據庫的范式(Normalization)是數據庫設計中的一個重要概念,它是為了減少數據冗余、避免更新異常,并保持數據一致性而提出的規則。簡單來說,范式就像是給數據庫表“瘦身”和“整理”的標準,讓數據存儲更高效、更可靠。范式從低到高逐步加強,每一個更高的范式都必須滿足前一個范式的要求。
下面,我用通俗的語言講解常見的范式,包括1NF(第一范式)、2NF(第二范式)、3NF(第三范式)和BCNF(Boyce-Codd范式)。我會先用表格呈現每個范式的定義、要求和例子,然后補充一些總體說明。
范式 | 定義和要求 | 例子 |
---|---|---|
1NF(第一范式) | 表中的每個屬性(列)必須是原子值,不能是集合或多值;簡單說,就是每個單元格只能放一個值,不能放列表或數組。 | 假設有一個學生表:學生ID、姓名、電話。如果電話列放“123456,789012”,這就不符合1NF;應該拆分成多行或單獨表,比如學生ID=1,姓名=張三,電話=123456;另一行學生ID=1,姓名=張三,電話=789012。 |
2NF(第二范式) | 必須先滿足1NF;此外,非主鍵屬性必須完全依賴于整個主鍵,不能部分依賴(如果主鍵是復合的)。通俗地說,非主鍵列不能只依賴主鍵的一部分。 | 訂單表:主鍵(訂單ID + 商品ID),屬性:訂單日期、商品名稱。如果商品名稱只依賴商品ID(不依賴訂單ID),這就不符合2NF;應該把商品名稱拆到單獨的商品表中。 |
3NF(第三范式) | 必須先滿足2NF;此外,非主鍵屬性不能傳遞依賴于主鍵(即非主鍵之間不能有依賴關系)。簡單說,非主鍵列不能互相依賴。 | 員工表:員工ID(主鍵)、部門ID、部門名稱。如果部門名稱依賴部門ID(而部門ID依賴員工ID),這就不符合3NF;應該把部門ID和部門名稱拆到部門表中。 |
BCNF(Boyce-Codd范式) | 必須先滿足3NF;此外,任何決定因素**(能決定其他屬性的屬性)都必須是候選鍵**。通俗地說,消除主屬性對碼的部分和傳遞函數依賴。 | 教授教課表:(教授ID + 課程ID)為主鍵,屬性:學生ID。如果教授ID決定課程ID,但教授ID不是候選鍵,這就不符合BCNF;需要進一步拆表。 |
這些范式的好處是減少冗余,比如在不范式化的表中,更新一個數據可能需要改多處,容易出錯。缺點是查詢時可能需要更多JOIN操作,影響性能,所以實際設計時有時會反范式化(denormalization)來優化。
舉個整體例子:想象一個圖書館借書系統。如果不范式化,表可能重復存書名、作者等;范式化后,書表單獨存書信息,借書表只存借書記錄,減少重復。
二、AI 出題
(1)題目
- 數據庫范式設計的主要目的是什么?
A. 增加數據冗余
B. 減少數據冗余和異常
C. 提高查詢復雜度
D. 降低數據安全性 - 第一范式(1NF)的要求是什么?
A. 非主鍵屬性完全依賴主鍵
B. 每個屬性都是原子值
C. 消除傳遞依賴
D. 所有決定因素都是候選鍵 - 如果一個表的主鍵是復合鍵(如A+B),但某個非主鍵屬性只依賴A,這違反了哪個范式?
A. 1NF
B. 2NF
C. 3NF
D. BCNF - 第三范式(3NF)在第二范式的基礎上增加了什么要求?
A. 屬性原子性
B. 部分依賴消除
C. 傳遞依賴消除
D. 復合主鍵要求 - BCNF范式相對于3NF的加強點是什么?
A. 要求屬性原子值
B. 消除非主鍵間的依賴
C. 所有決定因素必須是候選鍵
D. 只處理單主鍵表 - 以下哪個例子不符合1NF?
A. 表中一列存儲多個電話號碼,用逗號分隔
B. 非主鍵完全依賴主鍵
C. 表有復合主鍵
D. 表有唯一索引 - 在一個學生成績表中,如果“班級名稱”依賴“班級ID”,而“班級ID”依賴“學生ID”,這違反了哪個范式?
A. 1NF
B. 2NF
C. 3NF
D. BCNF - 數據庫設計中,為什么有時會選擇反范式化?
A. 為了嚴格遵守范式
B. 為了提高查詢性能
C. 為了增加數據冗余
D. 為了簡化表結構 - 以下關于范式的說法正確的是?
A. 所有數據庫都必須達到BCNF
B. 更高的范式總是更好的
C. 范式化可以減少插入、更新和刪除異常
D. 1NF允許多值屬性 - 如果一個表滿足3NF,但有一個非候選鍵屬性決定了另一個屬性,這可能違反了哪個范式?
A. 1NF
B. 2NF
C. 3NF
D. BCNF
(2)答案和解析
- 答案:B。
解析:數據庫范式的主要目的是通過規范化表結構來減少數據冗余、避免插入/更新/刪除異常,并保持數據一致性。例如,如果不范式化,更新一個人的地址可能需要改多行數據,容易出錯;范式化后,只改一處即可。 - 答案:B。
解析:1NF的核心要求是確保表中每個屬性的值都是不可分的原子值,不能是集合或列表。例如,不能在一列中放“蘋果,香蕉”,而應拆分成多行或多列。這是最基本的范式,其他范式都以此為基礎。 - 答案:B。
解析:這描述了部分函數依賴,即非主鍵屬性只依賴復合主鍵的一部分,違反了2NF的要求。2NF要求非主鍵必須完全依賴整個主鍵。例如,在(訂單ID + 商品ID)為主鍵的表中,商品價格不能只依賴商品ID。 - 答案:C。
解析:3NF在2NF的基礎上要求消除非主鍵屬性之間的傳遞依賴,即一個非主鍵不能通過另一個非主鍵間接依賴主鍵。例如,員工表中“部門經理”不能通過“部門ID”依賴“員工ID”,應拆表。 - 答案:C。
解析:BCNF是3NF的加強版,它要求表中任何函數依賴的左邊(決定因素)都必須是候選鍵,從而消除更多潛在異常。例如,在某些表中,即使滿足3NF,如果一個非鍵屬性決定了主鍵部分,也需調整。 - 答案:A。
解析:用逗號分隔多個電話號碼意味著該列不是原子值,違反1NF。1NF要求每個單元格只有一個簡單值。其他選項如復合主鍵或索引與1NF無關。 - 答案:C。
解析:這是典型的傳遞依賴:“班級名稱”依賴“班級ID”,“班級ID”依賴“學生ID”,違反3NF。3NF要求非主鍵不能互相依賴,應將班級信息拆到單獨表中,只在學生表存班級ID。 - 答案:B。
解析:反范式化(denormalization)是有意引入一些冗余來減少JOIN操作,從而提高查詢速度。例如,在報表表中重復存一些數據,避免頻繁聯表查詢。雖然增加了冗余,但適合讀多寫少的場景。 - 答案:C。
解析:范式化確實能減少異常,如插入異常(無法插入不完整數據)。但不是所有數據庫都需BCNF(有時3NF夠用),更高的范式不總是更好(可能犧牲性能),1NF不允許多值屬性。 - 答案:D。
解析:如果滿足3NF但有非候選鍵決定了其他屬性,這違反BCNF。BCNF針對這種情況加強,例如在教授-課程表中,如果教授決定了系別,但教授不是候選鍵,就需調整表結構。