數據庫邏輯設計之三大範式

一、第一範式

1NF是對屬性的原子性,要求屬性具有原子性,不可再分解;

表:字段1、 字段2(字段2.1、字段2.2)、字段3 ......

如學生(學號,姓名,性別,出生年月日),如果認爲最後一列還可以再分成(出生年,出生月,出生日),它就不是一範式了,否則就是;

二、第二範式

2NF是對記錄的唯一性,要求記錄有唯一標識,即實體的唯一性,即不存在部分依賴

表:學號、課程號、姓名、學分;

這個表明顯說明了兩個事務:學生信息, 課程信息;由於非主鍵字段必須依賴主鍵,這裏學分依賴課程號姓名依賴與學號,所以不符合二範式。

可能會存在問題:

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

正確做法:

學生:Student(學號, 姓名);
課程:Course(課程號, 學分);
選課關係:StudentCourse(學號, 課程號, 成績)。

三、第三範式

如果一個關係屬於第二範式,並且在兩個(或多個)非主鍵屬性之間不存在函數依賴。(非主鍵屬性之間的函數依賴也稱爲傳遞依賴),那麼這個關係屬於第三範式。

3NF是對字段的冗餘性,要求任何字段不能由其他字段派生出來,它要求字段沒有冗餘,即不存在傳遞依賴

表: 學號, 姓名, 年齡, 學院名稱, 學院電話

注意:上表屬於第二範式,因爲主鍵由單個屬性組成(學號)

可能會存在問題:

  • 數據冗餘:有重複值;
  • 更新異常:有重複的冗餘信息,修改時需要同時修改多條記錄,否則會出現數據不一致的情況

正確做法:

學生:(學號, 姓名, 年齡, 所在學院);

學院:(學院,學院名稱, 電話)。

四、反範式化

一般說來,數據庫只需滿足第三範式(3NF)就行了。

沒有冗餘的數據庫設計可以做到。但是,沒有冗餘的數據庫未必是最好的數據庫,有時爲了提高運行效率,就必須降低範式標準,適當保留冗餘數據。具體做法是:在概念數據模型設計時遵守第三範式,降低範式標準的工作放到物理數據模型設計時考慮。降低範式就是增加字段,允許冗餘,達到以空間換時間的目的

〖例〗:如訂單表,“金額”這個字段的存在,表明該表的設計不滿足第三範式,因爲“金額”可以由“單價”乘以“數量”得到,說明“金額”是冗餘字段。但是,增加“金額”這個冗餘字段,可以提高查詢統計的速度,這就是以空間換時間的作法。

Rose 2002中,規定列有兩種類型:數據列計算列。“金額”這樣的列被稱爲“計算列”,而“單價”和“數量”這樣的列被稱爲“數據列”。

五、範式化設計和反範式化設計的優缺點

5.1 範式化

優點:

  • 可以儘量減少數據冗餘
  • 數據表更新快體積小
  • 範式化的更新操作比反範式化的更新操作更快
  • 範式化的表通常比反範式化更小

缺定:

  • 查表需要練表查詢(導致性能降低
  • 更難進行索引優化

5.2 反範式化

優點:

  • 可以減少表的關聯
  • 可以更好的進行索引優化

缺點:

  • 在數據冗餘以及數據維護異常
  • 對數據修改需要更多成本
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章