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