鄒瓊
(湖北經濟學院 信息管理學院,湖北 武漢 430205)
淺談數據庫設計中范式的應用
鄒瓊
(湖北經濟學院 信息管理學院,湖北 武漢 430205)
非計算機專業的數據庫理論的教學是個難點,文章針對“范式”概念的理解結合筆者在教學實踐中的實驗案例,對數據庫設計中的數據模式的規范化進行了詳細闡述。并對常用的三大范式和反范式的一些應用進行了探討。
數據庫設計;范式;關系規范化
隨著信息化時代的到來,數據庫技術被廣泛地應用于經濟建設、科學研究、組織管理的各個領域和我們生活的各個方面,學習和掌握一定的數據庫知識變得尤為重要,為此許多高等院校都為非計算機專業的學生開設了《數據庫原理》公共課程。但是許多學生對數據庫的基本理論知識的掌握存在困難,特別是數據庫設計中的范式的定義與作用,普遍覺得難以理解。下面就針對這個知識點結合筆者多年的教學實踐中的一些教學案例來進行說明。
在整個數據庫的開發過程中,數據庫的設計的好壞是一個數據庫成敗與否的關鍵;而對于占主流地位的關系數據庫的設計而言,如何構造一個適合該系統的數據模式,如何確定每個關系模式或者直接說確定每張表的屬性字段等就直接影響到未來該系統的運行效率。這里我們就需要一個數據庫設計的有力工具——規范化理論。關系數據庫規范化理論是E. F.Godd在1971年提出的,它按照屬性間的不同依賴程度分為第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式、第四范式(4NF)和第五范式(5NF)等。這些范式其實就是一些確定關系模式的規則,而且這些規則是按層次遞進分等級的,每一級都是在下一級的基礎上制定的更嚴格的規則,即滿足最低要求的范式是第一范式(1NF),在第一范式的基礎上進一步滿足更多要求的是第二范式(2NF),以此類推。實際上在一般的系統設計中,通常只需要規范到3NF的層次就足夠了。滿足3NF規則的數據庫結構明晰的,可以避免發生插入、刪除和更新操作異常,最大限度降低數據庫的冗余度,提高了數據庫的通用性和安全性。
(一)第一范式(1NF)
第一范式是關系數據庫中的關系要滿足的最低要求,它要求每一個關系或表中的每一個字段分量都是不可再分的數據項,簡而言之,第一范式就是無重復的列。我們以常見的教學管理系統數據庫中的信息為例,以下表1是一張記錄學生基本信息以及選課情況的表。這是我們手工制表中經常出現的形式,但是很明顯表中的選修課程字段存在大量重復的字段信息,它不滿足第一范式的要求,列中出現子列的形式根本不屬于關系模型,是不可能導入到任意一個關系型的數據庫管理系統DBMS中的。所以我們應該對它進行規范和細分。
我們可以通過把重復的字段放到一個獨立的表中,把這些表通過一對多關聯聯系起來的這種方式來消除表中的重復字段。這里我們可以將選修課程字段從學生表中拿出,單獨放置到選課表中,而選課表包含學號,課程編號和課程名稱字段。這樣每一條記錄就能表達一個學生所選的一門課程,同一個學生所選的不同課程就會產生另一條學號相同,課程名稱不同的記錄。而且這張表通過學號字段就能與原來的學生表關聯起來。這樣消除了重復的選修課程字段后表就屬于1NF。

?
(二)第二范式(2NF)
第一范式是關系數據庫中的表要滿足的最低要求,而僅僅滿足這個最低要求的表極有可能出現一些異常,我們還是來看這樣一張記錄選修課程情況的表,表中包含字段有:學號、姓名、課程編號、課程名稱、學分、成績。看起來這張表中的數據十分完備,而且表中沒有重復字段,已經是1NF了。可是進一步分析我們卻能發現其中問題多多:每當有一位同學選修了一門新的課程時,該同學的姓名就不得不隨著新記錄的插入而被重復存儲一次,學生們選修的課程越多意味著姓名重復越多。同時課程名稱和學分字段也是如此,一門課程被選修的次數越多,意味著該課程的課程名稱與學分字段也必須得重復存儲越多,這就是典型的數據冗余。重復的冗余數據進而會引發數據的更新異常。因為一旦需要修改某個姓名或課程名稱、學分等所涉及到的修改就不止一條記錄,重復的越多意味著出錯的可能性越大。而且由于課程名稱和學分字段僅存于這張表中,若有新開的課程要記錄就會因為還沒有選修該課程的學生而無法存入該表,這就帶來了插入異常。同樣的道理,如果出于某些原因如轉學等將某個學生的選課記錄刪除,那么如果只有該生選修了某門課程的話,這門課程的信息也將隨著該記錄的刪除而徹底丟失,這也就是發生了刪除異常的情況。
這些異常情況的發生實際上都是因為表中的字段存在部分依賴的情況。所謂部分依賴就是指表中的非主鍵字段,并不是完全依賴于主鍵而確定,而僅僅是由主鍵的一部分來確定。我們知道主鍵是能夠確定每一條記錄的標識字段,也就是一個主鍵值對應一條記錄。對于單一字段的主鍵,是不可能出現部分依賴的情況的,而對于多字段構成的聯合主鍵則不然。如果表中某個字段僅由聯合主鍵中的某一個字段就能確定的話,我們就稱之為發生了部分依賴。在這張選修課程記錄表中,很明顯主鍵是由學號和課程編號兩個字段聯合擔當,也就是說每一條記錄的學號與課程編號的組合都是互不相同的唯一的。但是其中姓名字段僅只依賴于學號就可以確定;課程名稱和學分字段也是非主鍵字段,但它們也僅僅只依賴于主鍵的一部分——課程編號字段就能確定。
正是由于這些部分依賴的存在引發了各種異常情況,所以我們必須通過進一步規范化的手段消除這些部分依賴。我們可以通過分解原表,使得每一張表都成為2NF。將姓名字段歸并到一張學生表中,與原表靠學號字段關聯;將課程名稱和學分字段也單獨成立一張課程表依靠課程編號字段關聯,分解后的3張表中的字段如下:學生表(學號、姓名、性別、出生日期等);課程表(課程編號、課程名稱、學分);選課表(學號、課程編號、成績)。當我們消除了表中的部分依賴后,我們就可以說我們的表已經是2NF了。因此所謂第二范式就是要消除表中的部分依賴,同時我們也就清楚了如果表中的主鍵是單一字段的話那么就一定是2NF,因為只有聯合主鍵才可能出現違反2NF的部分依賴。
(三)第三范式(3NF)
第三范式是在第二范式的基礎上加上了更嚴格的限制條件:表中非主鍵字段不能傳遞依賴與主鍵。我們來看這樣一張記錄學生基本信息的表,表中字段有:學號,姓名,性別,出生日期、專業、所屬院系。我們可以很直觀的判斷出這是一個2NF,因為表的主鍵是單一字段學號,表中其他的非主鍵字段如姓名、出生日期、專業、院系都完全依賴于學號,不可能出現部分依賴。可是該表仍有明顯的問題,那就是學號能夠唯一確定專業,可是專業也能夠唯一確定院系,也就是說出現了傳遞依賴的情況。當存儲學生信息時,同一個專業的學生所屬院系將會被重復存儲,這便帶來了數據冗余。所以表7沒有達第三范式的要求,不是3NF。
為了使該表成為3NF,我們同樣要對表進行規范化的重新設計,我們將專業與院系的字段從學生表中移除,使其單獨成為一張院系表,并且通過專業編號進行關聯,這樣的兩張表消除了傳遞依賴關系,就都是第三范式了。
經過3個范式的層層規范,現在的數據模式已經得到了極大程度的優化,通過這幾張表之間適當的連接查詢,我們既可以得到所需的數據,同時又避免了數據冗余和各種異常。
規范化的優點是明顯的,它避免了大量的數據冗余,節省了存儲空間,保持了數據的一致性。當一個庫里的數據經常發生變化時,達到3NF的庫可以使用戶不必在超過兩個以上的地方更改同一個值。那么是不是只要把所有的表都規范為3NF后,數據庫的設計就是最優的呢?這可不一定。范式越高意味著表的劃分更細,一個數據庫中需要的表也就越多,用戶不得不將原本相關聯的數據分攤到多個表中。當用戶同時需要這些數據時只能采用連接表的形式將數據重新合并在一起。同時把多個表聯接在一起的花費是巨大的,尤其是當需要連接的兩張或者多張表數據非常龐大的時候,表連接操作幾乎是一個噩夢,這嚴重地降低了系統運行性能。
所以有時為了提高數據庫的性能,需要適當犧牲規范化的要求,采取所謂反范式的設計,即不完全按照范式的理論來設計數據表結構。比如在上面的數據庫中學生的姓名是很少變化的,而選課表中由于保存的數據非常多,而且最終提取學生成績時常常是需要姓名信息的,那么為了避免數據庫系統實際運行時為獲取姓名頻繁地聯接學生表,我們就干脆違反2NF將姓名字段重復的存儲在選課表中。還有一種情況就是當表中數據量很大,而數據的緊要程度又不完全相同的時候,我們也可以違反范式的無重復原則,把一張完整的表分成多張子表來分表存儲。比如我們可以用水平分割表的方法將表中的歷史陳舊數據分割到另一張表中進行靜態存儲,這樣可以加快表的查找速度。但同時反范式也會引入相應的更新刪除等額外操作和程序設計的復雜性,因此在實際應用中應按實際需求適當使用。
由此可見范式是改善關系模式的一種方法,可衡量一個數據庫中表設計的合理與否并不僅僅只依賴于范式,在實際應用中,我們應該靈活運用三大范式而不拘泥于三大范式,在一定制約條件下,尋求能較好地滿足用戶需求的關系模式且性能最優的數據庫。
[1]薩師煊,王珊.數據庫系統概論(第3版)[M].北京:高等教育出版社,2000,(2).
[2]佘學兵,饒蘇敏.關系數據庫中關系模式的規范化[J].科技廣場,2008,(10).
[3]徐興雷,汪嬋嬋.反范式在海量數據庫設計中的應用[J].科技傳播,2011,(5).
[4]褚洪波.關系數據庫設計范式應用實例剖析[J].雞西大學學報,2008,(1).
[5]朱海峰.關系規范化理論在數據庫設計中的應用[J].中國科技信息,2006,(13).