三范式理解
第一范式: 屬性不可分割性
如: 學生表(姓名,年齡,性別,班級,宿舍號,家庭成員) 其中家庭成員為可分割的所以不符合第一范式
第二范式: 不存在組合關鍵字中的某些字段決定非關鍵字段的情況
如:
(學號, 課程名稱) → (姓名, 年齡, 成績, 學分) 這個數據庫表不滿足第二范式,因為存在如下決定關系:
(課程名稱) → (學分)
(學號) → (姓名, 年齡)
部分屬性依賴於關鍵字中的部分字段。
(1) 數據冗余:
同一門課程由n個學生選修,"學分"就重復n-1次;同一個學生選修了m門課程,姓名和年齡就重復了m-1次。
(2) 更新異常:
若調整了某門課程的學分,數據表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。
(3) 插入異常:
假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入數據庫。
(4) 刪除異常:
假設一批學生已經完成課程的選修,這些選修記錄就應該從數據庫表中刪除。但是,與此同時,課程名稱和學分信息也被刪除了。很顯然,這也會導致插入異常。
第三范式:每個非關鍵字之間相互獨立,並依賴於關鍵字,不能存在傳遞依賴關系。
例:學生(學號,姓名,所在系,系名稱,系地址)
關鍵字學號決定各個屬性。由於是單個關鍵字,沒有部分依賴的問題,肯定是2NF。
但這關系肯定有大量的冗余,有關學生所在的幾個屬性:所在系,系名稱,系地址將重復存儲,插入,刪除和修改時也將產生類似以上例的情況。
原因:關系中存在傳遞依賴造成的。即:學號-> 所在系。 而所在系-> 學號卻不存在,所在系-> 系地址, 因此關鍵字:學號對所在系函數決定是通過傳遞依賴,學號-> 系地址,實現的。也就是說,學號不直接決定非主屬性系地址。
解決目地:每個關系模式中不能留有傳遞依賴。
解決方法:分為兩個關系 S(學號,姓名,所在系),D(所在系,系名稱,系地址)
注意:關系S中不能沒有外關鍵字DNO。否則兩個關系之間失去聯系。