資料庫正規化

2021-07-05 23:10:48 字數 2137 閱讀 5246

資料庫正規化

正規化,是用來規定資料冗餘程度的,一般越高的正規化資料庫冗餘越小。

目前關聯式資料庫有六種正規化:

第一正規化(1nf)

第二正規化(2nf)

第三正規化(3nf)

巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。

一般只用前三種正規化,後三種基本沒使用。一般說來,資料庫只需滿足第三正規化(3nf)就行了。

下面一一來講解:

1. 第一正規化(1nf)

遵循兩個原則:a. 每個表要有主鍵;b. 每一列都是不可分割的原子資料項。

2. 第二正規化(2nf)

簡而言之,第二正規化就是在第一正規化的基礎上屬性完全依賴於主鍵。

3. 第三正規化(3nf)

在1nf基礎上,任何非主屬性不依賴於其它非主屬性。

正規化應用例項

下面以乙個學校的學生系統為例分析說明,這幾個正規化的應用。

第一正規化(1nf)

資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。

在當前的任何關聯式資料庫管理系統(dbms)中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些dbms不允許你把資料庫表的一列再分成二列或多列。

因此,你想在現有的dbms中設計出不符合第一正規化的資料庫都是不可能的。首先我們確定一下要設計的內容包括那些。

學號、學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**等資訊。為了簡單我們暫時只考慮這些字段資訊。

我們對於這些資訊,說關心的問題有如下幾個方面:

學生有那些基本資訊?

學生選了那些課,成績是什麼?

每個課的學分是多少?

學生屬於那個系,系的基本資訊是什麼?

第二正規化(2nf)

首先我們考慮,把所有這些資訊放到乙個表中(學號,學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**)。

很明顯,就存在如下的依賴關係:

(姓名, 年齡, 成績, 學分) → (學號, 課程名稱),意思就是(姓名, 年齡, 成績, 學分) 依賴於(學號, 課程名稱)。

或者,(學號, 課程名稱) → (姓名, 年齡, 成績, 學分),即(學號, 課程名稱)決定(姓名, 年齡, 成績, 學分) 。

問題分析

因此不滿足第二正規化的要求,會產生如下問題:

資料冗餘:

同一門課程由n個學生選修,"學分"就重複n-1次;同乙個學生選修了m門課程,姓名和年齡就重複了m-1次。

更新異常:

1)若調整了某門課程的學分,資料表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。

2)假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入資料庫。

刪除異常 :

假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。

很顯然,這也會導致插入異常。

解決方案

把選課關係表selectcourse改為如下三個表:

課程:course(課程名稱,學分);

選課關係:selectcourse(學號,課程名稱,成績)。

第三正規化(3nf)

接著看上面的學生表student(學號,姓名,年齡,性別,系別,系辦位址、系辦**),關鍵字為單一關鍵字"學號"。

必然存在如下決定關係:

(學號)→ (姓名,年齡,性別,系別,系辦位址、系辦**)

但是還存在下面的決定關係:

(系別)→(系辦地點,系辦**)

即存在非關鍵字段(系辦地點,系辦**)對非關鍵字段(系別)的依賴。

它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況。

根據第三正規化把學生關係表分為如下兩個表就可以滿足第三正規化了:

學生:(學號,姓名,年齡,性別,系別);

總體來說,設計為如下四個表:

學生:student(學號,姓名,年齡,性別,系別),關鍵字(或者主鍵)為學號;

課程:course(課程名稱,學分),關鍵字為課程名稱;

選課關係:selectcourse(學號,課程名稱,成績),關鍵字為(學號,課程名稱)。

上面的資料庫表就是符合1,2,3正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。

更多參考

資料庫 資料庫正規化

關聯式資料庫的設計規範。不同的規範要求被稱為不同的正規化,越高的正規化資料庫冗餘越小。減少資料庫中資料冗餘的過程 1 第一正規化 1nf 在關係模式r中,當且僅當所有屬性只包含原子值,即每個分量都是不可再分的資料項,則稱r滿足1nf。例如表所示的教師職稱情況關係就不滿足1nf。原因在於,該關係模式中...

資料庫正規化 三正規化

所謂第一正規化 1nf 是指在關係模型中,對域新增的乙個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化 1nf 表中的每個域值只能是實體的乙個屬性或乙個屬性的...

資料庫正規化

注 表在定義中被稱為關係,記作r 欄位在定義中被稱作屬性 模式 資料庫中有三種模式,外模式,內模式,模式 粗體是關鍵字的意思 斜體為外來鍵 以前寫下來的,但是用了多年的帳號已經忘了,唯有把文章轉到這裡來了 真暈哦 http blog.csdn.net fantasylu archive 2004 0...