一文弄懂數(shù)據(jù)庫設計的三范式
寫在前面
很多數(shù)據(jù)庫設計者,都是按照自己的性子和習慣來設計數(shù)據(jù)庫數(shù)據(jù)表,其實不然。
其實,數(shù)據(jù)庫的設計也有要遵循的原則。
范式,就是規(guī)范,就是指設計數(shù)據(jù)庫需要(應該)遵循的原則。
每個范式,都是用來規(guī)定某種結構或數(shù)據(jù)要求——后一范式都是在前一范式已經滿足的情況用來“加強要求”(這句話很重要)。
這也是面試中經常會問到的“數(shù)據(jù)庫三范式指的是什么?”,很多小伙伴只知道原子性、唯一性、獨立性,但是知其然而不知其所以然。
在這里,讓你徹底弄明白,什么叫數(shù)據(jù)庫的三范式!
第一范式(1NF):原子性(存儲的數(shù)據(jù)應該具有“不可再分性”)
不良做法如下,“學生”一列有多項信息都合在一起了,不再具有原子性,所以應該分開:
實際中,原子性還是比較容易理解的。
修改后:
第二范式(2NF):唯一性 (消除非主鍵部分依賴聯(lián)合主鍵中的部分字段)(一定要在第一范式已經滿足的情況下)
需要實現(xiàn)每一行數(shù)據(jù)具有唯一可區(qū)分的特性,并不能有部分依賴關系。
通常,給一個表加主鍵(也是推薦做法),就可以做到“唯一可區(qū)分”。
但主鍵有這樣情況:
設定一個字段為主鍵:此時,表示該一個字段的值就可以明確確定一行數(shù)據(jù)。
設定多個字段為主鍵:表示只有這多個字段的值都確定后才能確定一行數(shù)據(jù)。此時也稱為“聯(lián)合主鍵”。
什么叫依賴:
如果確定一個表中的某個數(shù)據(jù)(A),則就可以確定該表中的其他另一個數(shù)據(jù)(B),則我們說:B依賴于A。
實際上,一個表只要有主鍵,則其他非主鍵一定是依賴于主鍵的。
什么叫“部分依賴”:
如果確定一個表中的某個數(shù)據(jù)組合(A,B),則就可以確定該表中的其他另一個數(shù)據(jù)(C),則我們說:C依賴于(A,B)(此時A,B通常就是做出主鍵)。
但:如果某個數(shù)據(jù)D,它只依賴于數(shù)據(jù)A,或者說,A一確定,則D也可以確定,此時我們就稱為“數(shù)據(jù)D部分依賴于數(shù)據(jù)A——可見部分依賴是指某個非主鍵字段,依賴于聯(lián)合主鍵字段的其中部分字段。
好了,說了這么多,估計大家也都糊涂了,接下來上例子吧!
不良做法:
這個表雖然滿足了第一范式,但是也很明顯的感受到它的冗余性,其中學生信息和課程信息是冗余的。
以上表如果是需要確定主鍵,就得是學生+課程作為聯(lián)合主鍵。
第二范式要求非主鍵字段的值必須完全依賴主鍵(不能部分依賴),所以以上表中,學分是依賴課程的,成績是依賴學生的。
修改后,分為學生信息表、課程信息表、學生學分表:
學生信息表:只代表學生的個人信息,主鍵使用id以防止重名。
課程信息表:這里的主鍵可以不用id,使用課程名稱也可以,不會有重名。
學生學分表:學生和課程,確定一個學分,這里學生id和課程id作為聯(lián)合主鍵來對應一條成績。
第三范式(3NF):獨立性,消除傳遞依賴(非主鍵值不依賴于另一個非主鍵值)
在一個具有主鍵的表中,假設主鍵為A,其必然其他非主鍵都依賴于該主鍵,比如:B依賴于A,C依賴于A,D依賴于A。。。。。。
但同時:如果該表中的某個字段B的值一確定,就能夠確定另一個字段的值C,則我們稱為C依賴于B。
那么,就出現(xiàn)了:
C依賴B,B依賴A——這就是傳遞依賴。
則消除該傳遞依賴的的通常做法,就是將C依賴于B的數(shù)據(jù),分離到另一個表中。
好了,還是蒙蒙的吧,上例子:
不良例子:
以上表既滿足第一范式也滿足第二范式,非主鍵字段也完全依賴于主鍵字段。
但是,院系電話字段,其實是依賴院系字段的。也就是說,院系電話字段是非主鍵值,而依賴了另一個非主鍵值-院系。所以就不符合第三范式。
改良:
一個學生表,一個院系表,一目了然。
如果修改了院系信息,對應著也不需要修改學生信息表。但是如果還是使用以上不良例子的話,修改其中一個院系信息,得對應修改所有所屬該院系的學生,
總結
通常,在實踐中,滿足3范式只要做到“一個表只存一種數(shù)據(jù)”基本就可以實現(xiàn)。
另外,范式不是絕對要求,有時候我們?yōu)榱藬?shù)據(jù)的使用方便,還會(需要)故意違反范式。
具體設計需求,還需要在工作中多多練習,尋找到最適合,最方便的數(shù)據(jù)庫設計方案出來~
到此這篇關于一文弄懂數(shù)據(jù)庫設計的三范式的文章就介紹到這了,更多相關數(shù)據(jù)庫三范式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
openGauss數(shù)據(jù)庫在CentOS上的安裝實踐記錄
這篇文章主要介紹了openGauss數(shù)據(jù)庫在CentOS上的安裝實踐,本文是基于華為云ECS+CentOS 7的openGauss數(shù)據(jù)庫安裝實踐,需要的朋友可以參考下2022-07-07SQL數(shù)據(jù)庫的所有命令(函數(shù)、運算符)匯總大全
結構化查詢語言(Structured?Query?Language)簡稱SQL,結構化查詢語言是一種數(shù)據(jù)庫查詢和程序設計語言,用于存取數(shù)據(jù)以及查詢、更新和管理關系數(shù)據(jù)庫系統(tǒng)。sql語句就是對數(shù)據(jù)庫進行操作的一種語言。2023-01-01Maven nexus 安裝nexus私服出現(xiàn)的問題和解決辦法
本文主要介紹安裝nexus私服的時候出現(xiàn)問題的解決辦法,這里整理了兩種問題并詳細說明了解決辦法,有需要的朋友可以參考下2016-08-08數(shù)據(jù)庫安裝包和升級包腳本工具RedGate使用介紹
這篇文章主要介紹了數(shù)據(jù)庫安裝包和升級包腳本工具RedGate使用介紹,RedGate是一個SQL腳本生成工具,需要的朋友可以參考下2014-07-07通過Qt連接OpenGauss數(shù)據(jù)庫的詳細教程
本教程介紹如何通過Qt連接OpenGauss數(shù)據(jù)庫,在openGauss所在的root環(huán)境下執(zhí)行相關步驟,需要Windows下配置ODBC數(shù)據(jù)源,本文給大家介紹的非常詳細,需要的朋友參考下吧2021-06-06WordPress導入數(shù)據(jù)庫出現(xiàn)”Unknown collation: ‘utf8mb4_unicode_ci”錯誤的解
這篇文章主要介紹了WordPress導入數(shù)據(jù)庫出現(xiàn)”Unknown collation: ‘utf8mb4_unicode_ci”錯誤的解決辦法的相關資料,需要的朋友可以參考下2015-10-10