天天看點

《DBA修煉之道:資料庫管理者的第一本書》——3.6節範式

本節書摘來自華章社群《dba修煉之道:資料庫管理者的第一本書》一書中的第3章,第3.6節範式,作者(美)craig s. mullins,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.6 範式

正如前面所提,dr. codd首先描述了資料規範化。他在1971年和1972年發表了幾篇論文來描述前三種範式。後來codd和其他人定義了額外的範式。

3.6.1 第一範式

第一範式(1nf)的目标是去除實體中的重複分組和非原子資料。資料符合1nf時,實體的每個屬性都是離散的(換句話說,都是原子的)。術語atomic由atom演變而來,是指可以獨自存在的、不可分割的最小粒子。

第一範式去除實體中的重複分組和非原子資料。

當且僅當資料表的所有列隻包含原子值時,即滿足第一範式。

要想使資料模型符合1nf,必須将重複的分組分裂成單個實體以消除分組。換句話說,在單個實體中不要使用多個屬性來存儲相似的資料。表3-2的示例資料顯示了某大學的student資訊系統。

《DBA修煉之道:資料庫管理者的第一本書》——3.6節範式

該資料多處違反了1nf。首先,課程在student中确實是重複的,是以,課程資訊應轉移到獨立的實體。此外,要為所有的實體都指定辨別符。辨別符是實體的主碼。

謹慎地為各實體選擇合适的主碼。這可能比較棘手,最先想到的可能是選擇coursenum作為course實體的主碼。但就該資料的情況來看,還需要更多的資訊來識别課程資訊。課程完成日期可用于student和course的組合,即除非有學生參加并修完了該課程,這門課程才算完成。

第二個違背1nf的地方是,屬性studentname中包含了非原子資料。學生的姓名可以分解為:名、中間名和姓。由于可以分割,是以違背了第一範式。1nf的最終結果見表3-3和表3-4。

《DBA修煉之道:資料庫管理者的第一本書》——3.6節範式
《DBA修煉之道:資料庫管理者的第一本書》——3.6節範式

3.6.2 第二範式

第二範式(2nf)確定每個實體的所有屬性都依賴主碼。将1nf轉換成2nf,要為那些适用于多條記錄的屬性建立單獨的實體,并為該新實體配置設定外碼使之與原來的實體相關。簡單來說,實體執行個體不應依賴除實體主碼以外的任何東西。

第二範式確定每個實體的所有屬性都是依賴的。

當且僅當滿足第一範式,并且每一個非主屬性都完全依賴主碼時,即滿足第二範式。

再來看一下表3-3和表3-4,實體course中有些課程是重複的,如“英語經典i”和“人的上升”,這就違背了2nf。要解決這個問題,需要找出那些不依賴碼的屬性,将它們删除。這些被删除的屬性,連同它們依賴的主碼一起放到一個新的實體enrollment中。原來實體的主碼則保留在原實體中。

規範化的另一個好處是,你會經常需要為新建立的實體指定新的屬性。例如,也許新的實體course要為每門課程配置設定若幹學分計算到畢業學分中。是以,建立一個新的屬性來存儲每個特定課程的學分。當然,也可以決定student同樣需要更多資訊,如位址、電話号碼和出生日期,但為了簡單起見,暫時将它們省略了。

2nf規範化的最終結果如表3-3(實體student沒有改變)、表3-5和表3-6所示。

《DBA修煉之道:資料庫管理者的第一本書》——3.6節範式
《DBA修煉之道:資料庫管理者的第一本書》——3.6節範式

3.6.3 第三範式

第三範式(3nf)確定實體的屬性間不存在關聯,該實體内的每一個屬性都隻依賴主碼。對于滿足第三範式的資料模型有種半開玩笑的說法:每個屬性都依賴碼,唯一的碼,除了碼就沒有别的了,噢,codd!救救我吧!

第三範式確定實體的屬性間不存在關聯。

當且僅當滿足第二範式且每一個非主屬性既不依賴碼也不傳遞依賴碼時,即滿足第三範式。

一種檢測是否違背3nf的經驗法則是:檢視所有的屬性值是否适用于不止一個實體執行個體。如果有這樣的屬性,将它們轉移到單獨的實體。

下面再次看看student實體的資訊,是否有違背3nf的情況。仔細研究表3-3中的student資料,發現有的學生選了同樣的主修課,是以,有些主修課的資訊是重複的。特别是,在舉例中竟然有兩名學生都選了英國文學。要解決這個問題,需要将傳遞依賴碼的主修課這一屬性删除,并為它建立一個新的實體。表3-7和表3-8顯示了更正後的資料,滿足3nf。

《DBA修煉之道:資料庫管理者的第一本書》——3.6節範式
《DBA修煉之道:資料庫管理者的第一本書》——3.6節範式

3.6.4 一個規範化的資料模型

為了做到完美,應為剛才建立的student資料制作一張滿足3nf資料模型的圖表。請注意,我們并沒有填寫關聯的可選擇性。基于示例中的資料可以做到這一點,但在回答“每名學生都有主修課嗎?”這個問題之前還有很多問題需要考慮。目前的資料顯示确實如此,但實際上,大多數新生甚至高年級學生可能都沒有參加正式的主修課。

3.6.5 進一步的範式

規範化并沒有停留在3nf上,其他的範式已經得到大家的認可并記錄了。但通常不會有超過3nf的情況。以下是一些其他的範式。

通常不會有超過3nf的情況。

bc範式(bcnf)是修正的3nf。事實上,在codd後來的著作中就将bcnf稱作3nf。當且僅當每一個決定因素都是候選碼,即滿足bcnf。大多數滿足3nf的實體都滿足bcnf。

第四範式(4nf)指出如果“一對多”的屬性彼此獨立,就沒有任何實體可以有超過一個“一對多”的關聯。當且僅當滿足3nf且沒有多個多值依賴時,即滿足4nf。

第五範式(5nf)指出實體的每一個連接配接依賴必須是其候選碼的結果。

決定因素可以是任何屬性值,它能夠決定實體執行個體中其他屬性值。