數據庫三大范式的理解


對於三大范式一直沒有好好理解過,這次打算花時間搞懂這個概念。經過百度、翻閱博客以及看視頻,算是搞清楚了范式是什么,記錄下來,供以后復習。

百度知道 的一則回答非常好:

image-20220301233109198

由此可見,范式,就是一種規范,在設計一張表時所遵循的規范。為什么有這種規范,目的就是更好解決數據冗余,提高存儲效率。

然而,

實際中並沒有去嚴格遵守這種規范。因為規范和性能不可兼得!規范越高,性能越低。

比如:

《阿里巴巴JAVA開發手冊》里面寫超過三張表禁止join

image-20220302154745068

在實際的開發中需要考慮諸多問題,如:

  • 考慮商業化的需求和目標(成本,用戶體驗),數據庫的性能更加重要
  • 在規范性能問題的時候,需要適當地考慮一下規范性
  • 有時候會故意給某些表增加一些冗余的字段(多表查詢→單表查詢)
  • 有時會故意增加一些計算列(比如當有幾百萬條數據時,SELECT COUNT(*)會非常慢,直接增加一個計算列,每次增加一條數據時,這個列自動加一 )(大數據量→小數據量)

范式(Normal Form,NF)

范式是符合某一種級別的關系模式的集合。關系數據庫中的關系是要滿足一定要求的,滿足不同程度要求的為不同范式。

目前關系數據庫有六種范式:1NF,2NF,3NF,BCNF,4NF,5NF

這六種范式是包含關系:5NF ⊂ 4NF ⊂ BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF

常用的是第一范式(1NF)、第二范式(2NF)、第三范式(3NF),俗稱“三大范式”。

以下參考博客:https://www.cnblogs.com/wsg25/p/9615100.html

第一范式(1NF)

第一范式是指數據庫表的每一列都是不可分割的基本數據項。

舉例:

image-20220301224319457

上面的表中,家庭信息”和“學校信息”就不滿足第一范式,它們還可以再分割,調整如下:

image-20220301224508334

調整后每一列都不能再分了,故滿足第一范式。

第二范式(2NF)

第二范式

  • 必須滿足第一范式

  • 非主屬性完全依賴於主關鍵字,不能依賴於主鍵的一部分

    注:什么叫依賴於主鍵的一部分?這是針對聯合主鍵而言的,聯合主鍵就是用多個屬性組成的主鍵。

例子

image-20220301224947409

上表中,主鍵為聯合主鍵[訂單號,產品號],(只有這兩個屬性組合在一起,才能唯一地標識一行信息),這個表滿足第一范式(不可再分),但不滿足第二范式,因為“訂單金額”和“訂單時間”只依賴於“訂單號”(知道訂單號,訂單金額和時間也就確定了),不依賴於“產品號”,換句話說,他們不完全依賴主鍵[訂單號,產品號],而是依賴於主鍵的一部分,因此不滿足第二范式。調整如下:

image-20220301230140764

分成了兩個表,每個表都滿足第二范式,左表的非主屬性完全依賴於主鍵[訂單號,產品號],右表的非主屬性完全依賴於主鍵[訂單號]。

第三范式(3NF)

第三范式

  • 必須滿足第二范式
  • 任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

就是說,對於一個滿足第二范式的表,表中有可能存在某些列不直接依賴主鍵,而是間接依賴,必須消除。

例子

image-20220301231404974

上表中,所有屬性都完全依賴於學號這個主鍵,但是“班主任性別”和“班主任年齡”不是直接依賴學號的,而是通過直接依賴於“班主任姓名”而間接依賴於學號的(班主任姓名是直接依賴於學號的),故不滿足第三范式。調整如下:

image-20220301232010470

分成了兩個表,每個表都滿足第三范式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM