淺談數(shù)據(jù)庫設(shè)計(jì)要符合的三個(gè)范式和關(guān)鍵字
數(shù)據(jù)庫設(shè)計(jì)是應(yīng)用程序開發(fā)過程中非常重要的一個(gè)環(huán)節(jié)。一個(gè)好的數(shù)據(jù)庫設(shè)計(jì)不僅能讓我們實(shí)現(xiàn)軟件時(shí)得心應(yīng)手,對軟件后期的維護(hù),升級也是至關(guān)重要的。本文我們給出了數(shù)據(jù)庫設(shè)計(jì)三個(gè)范式和關(guān)鍵字的知識,并通過一個(gè)實(shí)例--教務(wù)管理系統(tǒng)來對其進(jìn)行詳細(xì)的說明,接下來我們就一起來了解一下這一過程。
對數(shù)據(jù)庫的設(shè)計(jì),主要是依賴界面設(shè)計(jì)來做的。界面反映了用戶的直接需求.把這些需求轉(zhuǎn)換成數(shù)據(jù)庫中的表.再為這些表添加主鍵,外鍵等約束.以確保數(shù)據(jù)關(guān)系的合理性.然后再根據(jù)業(yè)務(wù)的流程去梳理數(shù)據(jù)庫數(shù)據(jù)的流向是否得當(dāng)。
對數(shù)據(jù)庫字段的確定,主要是依賴界面中需要添加那些信息,需要處理那些信息,將對應(yīng)信息分類到相應(yīng)的表中.這里不說如何確定和提取字段了,因?yàn)樽约焊杏X也說不清楚,當(dāng)你見得數(shù)據(jù)庫多了,你就會自然而然的把他們分出來。
對數(shù)據(jù)庫三范式的理解和應(yīng)用
***范式:數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。
對于***范式,還是比較好理解的,說白了就是說一個(gè)列不能有多個(gè)值,每一個(gè)字段都是不可拆分的.比如數(shù)據(jù)庫有這樣一個(gè)字段:父母.顯然這是不行的.因?yàn)楦改笇儆趦蓚€(gè)獨(dú)立的個(gè)體,完全可以拆分.如果把他們設(shè)置為一個(gè)字段.結(jié)果就是對于這個(gè)字段來說,我們是不方便應(yīng)用的.因?yàn)楦改缚赡苡性蛑挥幸粋€(gè)或者其他情況,這樣對于數(shù)據(jù)庫來說,一個(gè)字段就是不完整的.對于數(shù)據(jù)的查詢,顯示都是有問題。
***范式:比較容易理解,一般人不會犯這樣的錯(cuò)誤.
第二范式:數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依賴(部分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所有非關(guān)鍵字段都完全依賴于任意一組候選關(guān)鍵字。
對關(guān)鍵字的說明
超關(guān)鍵字 :二維表中,能夠惟一確定記錄的一個(gè)字段或幾個(gè)字段的組合被稱為“超關(guān)鍵字”。“超關(guān)鍵字”雖然能***確定記錄,但是它所包含的字段可能是有多余的。
候選關(guān)鍵字:如果一個(gè)超關(guān)鍵字去掉其中任何一個(gè)字段后不再能***地確定記錄,則稱它為“候選關(guān)鍵字”(Candidate Key)。候選關(guān)鍵字既能***地確定記錄,它包含的字段有是最精煉的。也就是說候選關(guān)鍵字是最簡單的超關(guān)鍵字。
比如:在一個(gè)學(xué)生選課表中
學(xué)號 姓名 性別 課程名稱 成績 學(xué)分
這里的關(guān)鍵字為組合關(guān)鍵字,(學(xué)號 課程名稱)
出現(xiàn)的問題就是有:
1:姓名 性別 依賴于學(xué)號這個(gè)候選關(guān)鍵字。
2:學(xué)分 依賴于課程名稱這個(gè)候選關(guān)鍵字。
顯然是不符合第二范式的。
那么不符合第二范式會產(chǎn)生什么結(jié)果呢? 一般說來,不符合數(shù)據(jù)庫三范式會引起插入異常,更新異常,刪除異常.
1:插入異常:比如要新開一門課程,如果沒有人選的話,這么課程就插入不到數(shù)據(jù)庫,因?yàn)樗鼪]有學(xué)號,姓名,性別這些信息.
2:更新異常:如果要修改一門課程的學(xué)分,那么所有的學(xué)分字段都要修改,否則出現(xiàn)同一課程不同學(xué)分的情況.
3:刪除異常:如果某門課程取消了,要?jiǎng)h除課程的時(shí)候,這個(gè)學(xué)生的信息也會被刪除.
當(dāng)然,不合理的數(shù)據(jù)庫設(shè)計(jì)會造成大量的數(shù)據(jù)允余,比如某個(gè)學(xué)生選擇了n門課程,學(xué)生的姓名,性別就會重復(fù)n次.
如果把這個(gè)表拆分成三個(gè):
學(xué)號 姓名 性別
課程 學(xué)分
學(xué)號 課程 成績
這樣就不違反第二范式,也就是說,也肯定不會違反第二范式,因?yàn)樗麄儧]有組合關(guān)鍵字,可以看出,有組合關(guān)鍵字的可能違反第二范式.
第二范式也可以理解為:主鍵確定一條***記錄,也就是說關(guān)鍵字在數(shù)據(jù)庫表中***出現(xiàn)一次.
第三范式:在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。所謂傳遞函數(shù)依賴,指的是如果存在"A → B → C"的決定關(guān)系.
比如:學(xué)號 姓名 所在學(xué)院 學(xué)院名稱
這里的學(xué)院名稱完全依賴于學(xué)院,和關(guān)鍵字學(xué)號沒有關(guān)系.這樣就是傳遞依賴
違反第三范式也會產(chǎn)生數(shù)據(jù)庫異常和允余.這里就不再分析.
在基礎(chǔ)信息的數(shù)據(jù)庫設(shè)計(jì)中,***次設(shè)計(jì)很多違反了第三范式,這些主要是對界面的過分依賴造成的.也就是說,你看到的界面信息,很可能是來自不同的數(shù)據(jù)庫,如果你把他們放到一個(gè)數(shù)據(jù)庫,就會違反數(shù)據(jù)庫三范式.
關(guān)于數(shù)據(jù)庫設(shè)計(jì)過程中的三個(gè)范式和關(guān)鍵字方面的知識我們就介紹到這里,希望能夠給您帶來一些收獲吧,謝謝!
【編輯推薦】






