第一範式

第一範式

如果一個關係模式R的所有屬性都是不可分的基本數據項,則R∈1NF。簡單的說,就是每一個列(屬性),不能再分割成多個列(屬性)。

第一範式(First Normal Form,1st NF)就是指在同一表中沒有重複項出現,如果有則應將重複項去掉。這個去掉重複項的過程稱為規範化處理。按規範化建立的指標體系和表的過程,都自動保證所有表都滿足1st NF。

第一範式的關係


規定關係

第一範式規定關係的每一個屬性必須是一個不可分的數據項
非第一範式的例子如表5-5,可以轉換為第一範式如表5-6。
表5-5
導師專業研究生
 第一個研究生 第二個研究生
表5-6
導師專業第一個研究生 第二個研究生
幾乎所有的商用關係DBMS都要求關係為第一範式,現在流行的關係資料庫語言,如SQL,也都只支持第一範式。
如果關係僅僅滿足第一範式的條件是不夠的,可能會存在更新異常。為了消除這些異常,需要進行關係的規範化。

關係模式實例

下面是滿足第一範式的(不好的)關係模式的例子。例如:設有一關係模式R(S#,C#,G,TN,D),其中(S#)為學號,C#為課程號,G為成績,TN為任課教師姓名,D為教師所在系名,這些數據具有下列語義:
(1) 學號是一個學生的標識,課程號是一門課程的標識。
(2) 一位學生所修的每門課程都有一個成績。
(3) 每門課程只有一位任課教師,但一位教師可以教多門課。
(4) 教師中沒有重名,每位教師只屬於一個系。
下面是一個具體關係實例的數據,如表5-7:
表5-7
學號
S#
課程號
C#
成績
G
教師
TN
系名
D
s1c1g1t1d1
s1c2g2t2d2
s2c1g3t1d1
s2c2g4t2d2
s3c2g5t2d2
s3c3g6t2d2
雖然上述的關係模式只有四個屬性,但它是一個不好的關係模式,因為該模式在使用過程中有以下幾個問題:
(1) 數據冗餘。例如,教師所在系名對選該教師所開課的所有學生都重複輸入一次。
(2) 插入異常。由於關係的主鍵{S#, C#} 不能為空值,如果一個教師不教課,則這位教師的姓名及所屬的系名就不能插入表中。
(3) 刪除異常。如果所有學生都退選某一門課,則有關該門課的其它數據(任課教師名及所在系名)也將被刪除。
(4) 修改異常。如果改變一門課的任課教師,則需要修改表中選修該門課程的多行記錄,如果部分修改,部分不修改,則會導致數據的不一致。
上述關係模式之所以是一個不好的關係模式,是因為模式中存在部分函數依賴和傳遞函數依賴。消除這些部分函數依賴和傳遞函數依賴,就可以得到一個比較好的關係模式。
根據上述示例說明的語義,找出有下面的函數依賴集合F:
F = { {S#, C#}→ G,C#→TN,TN → D}
圖 5-2
針對函數依賴集合,運用關係資料庫設計理論,可以對上述關係進行分解,得到3個關係模式如下:
SCG(S#, C#, G)
CTN(C#, TN)
TND(TN, D)
上述3個關係可以消除數據冗餘,插入異常,刪除異常和修改異常等現象。是一個比較好的關係模式。把原來一個關係表的數據分解為三個關係表存放。
具體的關係實例的數據如表5-8:
表5-8
S#C#G
s1
s1
s2
s2
s3
s3
c1
c2
c1
c2
c2
c3
g1
g2
g3
g4
g5
g6
對於上述示例,是滿足第一範式的關係模式,但它不是一個好的關係模式,存在數據冗餘和操作異常現象。通過分析模式屬性間的函數依賴關係,把一個模式分解為三個關係模式后,消除了數據冗餘和操作異常。對於任一給定的模式,如何判斷是一個好的還是不好的關係模式呢?又如何把一個不好的關係模式分解轉換為好的關係模式呢?這就是在下面要討論的問題,對關係模式中X→Y的函數依賴關係,給出不同程度的限制,得到滿足不同範式要求的模式。

指導原則


第一範式包括下列指導原則:
關係中每個記錄的每個屬性只能包含一個值;
關係中的每個記錄必須包含相同數量的值;
關係中的每個記錄一定不能相同。
第一範式是對關係模式的最起碼的要求。不滿足第一範式的資料庫模式不能稱為關係資料庫。
但是滿足第一範式的關係模式並不一定是一個好的關係模式。
例:如職工號,姓名,電話號碼組成一個表(一個人可能有一個辦公室電話 和一個家裡電話號碼)規範成為1NF有三種方法:
一是重複存儲職工號和姓名。這樣,關鍵字只能是電話號碼。
二是職工號為關鍵字,電話號碼分為單位電話和住宅電話兩個屬性
三是職工號為關鍵字,但強制每條記錄只能有一個電話號碼。
以上三個方法,第一種方法最不可取,按實際情況選取后兩種情況。