資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、
實數、字元型、邏輯型、日期型等。在當前的任何關聯式資料庫管理系統(dbms)中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些dbms不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的dbms中設計出不符合第一正規化的資料庫都是不可能的。
首先我們確定一下要設計的內容包括那些。學號、學生姓名、年齡、
性別、課程名稱、課程學分、系別、學科成績,系辦位址、系辦**等資訊。為了簡單我們暫時只考慮這些字段息。我們對於這些資訊,所關心的問題有如下幾個方面。
學生有那些基本資訊
學生選了那些課,成績是什麼?
每個課的學分是多少
學生屬於那個系,系的基本資訊是什麼。
首先我們考慮,把所有這些資訊放到乙個表中(學號,學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**)下面存在如下的依賴關係。
(學號, 課程名稱) → (姓名, 年齡, 成績, 學分)
問題分析
因此不滿足第二正規化的要求,會產生如下問題
資料冗餘:同一門課程由n個學生選修,"學分"就重複n-1次;同乙個學生選修了m門課程,姓名和年齡就重複了m-1次。
更新異常:
1)若調整了某門課程的學分,資料表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。
2)假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入資料庫。
刪除異常 :假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。
解決方案
把選課關係表selectcourse改為如下三個表:
學生:student(學號,姓名,年齡,
性別,系別,系辦位址、系辦**);
課程:course(課程名稱,學分);
選課關係:selectcourse(學號,課程名稱,成績)。
接著看上面的學生表student(學號,姓名,年齡,性別,系別,系辦位址、系辦**),關鍵字為單一關鍵字"學號",因為存在如下決定關係:
(學號)→ (姓名,年齡,性別,系別,系辦位址、系辦**
但是還存在下面的決定關係
(學號) → (系別)→(系辦地點,系辦**)
即存在非關鍵字段"系辦地點"、"系辦**"對關鍵字段"學號"的傳遞函式依賴。
它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況。(資料的更新,刪除異常這裡就不分析了,可以參照2.1.1進行分析)
根據第三正規化把學生關係表分為如下兩個表就可以滿足第三正規化了:
學生:(學號,姓名,年齡,
性別,系別);
系別:(系別,系辦位址、系辦**)。
上面的資料庫表就是符合i,ⅱ,ⅲ正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。
資料庫正規化理解
當前我們使用的主流資料庫是關係型資料庫,所以我是記錄在關係型資料庫中對正規化的一些理解和看法。資料庫庫正規化分為六種 其實還有有乙個bcnf 分別為從第一正規化到第六正規化。高階一層是建立在所有低層的基礎上的,如第2正規化是建立在第一正規化的基礎上的,依次類推。下面分別舉例講解各種正規化 第一正規化...
資料庫正規化的理解
就是滿足了單一屬性不能再分割,正常情況下,你在資料庫裡建立的表肯定是滿足這個正規化的,要想不滿足這個正規化,可以在excel中嘗試合併單元格,拆分單元格體會下,就明白了。2nf 必須不存在非關鍵字段對組合的關鍵字段中的某些的依賴,比如某個表有 個關鍵字,但是它的非關鍵屬性 依賴第乙個關鍵字,非關鍵屬...
資料庫正規化的理解
接下來用例子再詳細介紹依賴關係 學號,課程 成績,由乙個學號和課程可以唯一確定這個學生這節課的成績,此時非主屬性成績完全依賴於碼 學號,課程 稱完全函式依賴。學號,課程 姓名,由學號和課程可以確定乙個學生的姓名,但本身由學號就可以確定學生的姓名,學號為 學號,課程 的真子集,此時非主屬性姓名部分依賴...