1. 程式人生 > >資料庫主鍵、唯一鍵、正規化

資料庫主鍵、唯一鍵、正規化

主鍵:
能夠唯一表示資料表中的每個記錄的【欄位】或者【欄位】的組合就稱為主碼(主鍵)。一個主鍵是唯一識別一個表的每一記錄,但這只是其作用的一部分,主鍵的主要作用是將記錄和存放在其他表中的資料進行關聯。在這一點上,主鍵是不同表中各記錄之間的簡單指標。主鍵約束就是確定表中的每一條記錄。主鍵不能是空值。唯一約束是用於指定一個或多個列的組合值具有唯一性,以防止在列中輸入重複的值。所以,主鍵的值對使用者而言是沒有什麼意義,並且和它要賦予的值也沒有什麼特別的聯絡。

外來鍵:
若有兩個表A,B,C是A的主鍵,而B中也有C欄位,則C就是表B的外來鍵。外來鍵約束主要用來維護兩個表之間資料的一致性。

主鍵是唯一的不能重複,非空的。

唯一鍵可以為空,但不可以重複。

第一正規化(1NF)

資料庫表中的欄位都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。在當前的任何關係資料庫管理系統(DBMS)中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些DBMS不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的DBMS中設計出不符合第一正規化的資料庫都是不可能的。 首先我們確定一下要設計的內容包括那些。學號、學生姓名、年齡、性別、課程名稱、課程學分、系別、學科成績,系辦地址、系辦電話等資訊。為了簡單我們暫時只考慮這些欄位資訊。我們對於這些資訊,所關心的問題有如下幾個方面。 學生有那些基本資訊 學生選了那些課,成績是什麼? 每個課的學分是多少 學生屬於那個系,系的基本資訊是什麼。

第二正規化(2NF)

首先我們考慮,把所有這些資訊放到一個表中(學號,學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦地址、系辦電話)下面存在如下的依賴關係。 (學號, 課程名稱) → (姓名, 年齡, 成績, 學分) 問題分析 因此不滿足第二正規化的要求,會產生如下問題 資料冗餘:同一門課程由n個學生選修,"學分"就重複n-1次;同一個學生選修了m門課程,姓名和年齡就重複了m-1次。 更新異常: 1)若調整了某門課程的學分,資料表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。 2)假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入資料庫。 刪除異常 :假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。 解決方案
把選課關係表SelectCourse改為如下三個表: 學生:Student(學號,姓名,年齡,性別,系別,系辦地址、系辦電話); 課程:Course(課程名稱,學分); 選課關係:SelectCourse(學號,課程名稱,成績)。

第三正規化(3NF)

接著看上面的學生表Student(學號,姓名,年齡,性別,系別,系辦地址、系辦電話),關鍵字為單一關鍵字"學號",因為存在如下決定關係: (學號)→ (姓名,年齡,性別,系別,系辦地址、系辦電話 但是還存在下面的決定關係 (學號) → (系別)→(系辦地點,系辦電話) 即存在非關鍵欄位"系辦地點"、"系辦電話"對關鍵欄位"學號"的傳遞函式依賴。 它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況。(資料的更新,刪除異常這裡就不分析了,可以參照2.1.1進行分析) 根據第三正規化把學生關係表分為如下兩個表就可以滿足第三正規化了: 學生:(學號,姓名,年齡,性別,系別); 系別:(系別,系辦地址、系辦電話)。 上面的資料庫表就是符合I,Ⅱ,Ⅲ正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。

1NF:欄位不可分;
2NF:有主鍵,非主鍵欄位依賴主鍵;
3NF:非主鍵欄位不能相互依賴;

解釋:
1NF:原子性 欄位不可再分,否則就不是關係資料庫;
2NF:唯一性 一個表只說明一個事物;
3NF:每列都與主鍵有直接關係,不存在傳遞依賴;

不符合第一正規化的例子(關係資料庫中create不出這樣的表):

表:欄位1, 欄位2(欄位2.1, 欄位2.2), 欄位3 ......

存在的問題: 因為設計不出這樣的表, 所以沒有問題;

不符合第二正規化的例子:

表:學號, 姓名, 年齡, 課程名稱, 成績, 學分;

這個表明顯說明了兩個事務:學生資訊, 課程資訊;

存在問題:

資料冗餘,每條記錄都含有相同資訊;
刪除異常:刪除所有學生成績,就把課程資訊全刪除了;
插入異常:學生未選課,無法記錄進資料庫;
更新異常:調整課程學分,所有行都調整。

修正:

學生:Student(學號, 姓名, 年齡);

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

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

滿足第2正規化只消除了插入異常。


不符合第三正規化的例子:

學號, 姓名, 年齡, 所在學院, 學院聯絡電話,關鍵字為單一關鍵字"學號";

存在依賴傳遞: (學號) → (所在學院) → (學院地點, 學院電話)

存在問題:

資料冗餘:有重複值;

更新異常:有重複的冗餘資訊,修改時需要同時修改多條記錄,否則會出現資料不一致的情況

刪除異常

修正:
學生:(學號, 姓名, 年齡, 所在學院);
學院:(學院, 地點, 電話)。
作者:sunxing007