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