下面以乙個學校的學生系統為例分析說明,這幾個正規化的應用。首先第一正規化(1nf):資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別 構成,包括整型、實數、字元型、邏輯型、日期型等。在當前的任何關聯式資料庫管理系統(dbms)中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些 dbms不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的dbms中設計出不符合第一正規化的資料庫都是不可能的。
首先我們確定一下要設計的內容包括那些。學號、學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**等資訊。為了簡單我們暫時只考慮這些字段資訊。我們對於這些資訊,說關心的問題有如下幾個方面。
2.1 第二正規化(2nf)例項分析
首先我們考慮,把所有這些資訊放到乙個表中(學號,學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**)下面存在如下的依賴關係。
(學號)→ (姓名, 年齡,性別,系別,系辦位址、系辦**)
(課程名稱) → (學分)
(學號,課程)→ (學科成績)
2.1.1 問題分析
因此不滿足第二正規化的要求,會產生如下問題
資料冗餘: 同一門課程由n個學生選修,"學分"就重複n-1次;同乙個學生選修了m門課程,姓名和年齡就重複了m-1次。
更新異常:
1)若調整了某門課程的學分,資料表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。
2)假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入資料庫。
刪除異常 : 假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。
2.1.2 解決方案
把選課關係表selectcourse改為如下三個表:
課程:course(課程名稱, 學分);
選課關係:selectcourse(學號, 課程名稱, 成績)。
2.2 第三正規化(3nf)例項分析
接著看上面的學生表student(學號,姓名, 年齡,性別,系別,系辦位址、系辦**),關鍵字為單一關鍵字"學號",因為存在如下決定關係:
(學號)→ (姓名, 年齡,性別,系別,系辦位址、系辦**)
但是還存在下面的決定關係
(學號) → (所在學院)→(學院地點, 學院**)
即存在非關鍵字段"學院地點"、"學院**"對關鍵字段"學號"的傳遞函式依賴。
它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況。 (資料的更新,刪除異常這裡就不分析了,可以參照2.1.1進行分析)
根據第三正規化把學生關係表分為如下兩個表就可以滿足第三正規化了:
學生:(學號, 姓名, 年齡, 性別,系別);
總結上面的資料庫表就是符合i,ii,iii正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。
資料庫設計三大正規化應用例項剖析
引言 資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。設計正規化是不是很...
資料庫設計三大正規化應用例項剖析
引言 資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。設計正規化是不是很...
資料庫設計三大正規化應用例項剖析
引言 資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。設計正規化是不是很...