1. 程式人生 > >2.2 正規化和反正規化

2.2 正規化和反正規化

2.2.1 第一正規化

原子性:要求屬性具有原子性,不可再分解。

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

2.2.2 第二正規化

惟一性:要求記錄有惟一標識,即實體的惟一性,即不存在部分依賴

表:學號、課程號、姓名、學分; 
這個表明顯說明了兩個事務:學生資訊, 課程資訊。由於非主鍵欄位必須依賴主鍵,這裡學分依賴課程號,姓名依賴與學號,所以不符合二正規化。

可能會存在問題:

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

 

正確做法: 

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

 

2.2.3 第三正規化

冗餘性:要求任何欄位不能由其他欄位派生出來,它要求欄位沒有冗餘,即不存在傳遞依賴。
表: 學號, 姓名, 年齡, 學院名稱, 學院電話 
因為存在依賴傳遞: (學號) → (學生)→(所在學院) → (學院電話) 。

可能會存在問題:

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

正確做法:

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

  學院:(學院, 電話)。

2.3.4 反正規化化

沒有冗餘的資料庫設計可以做到。但是,沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料。具體做法是:在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加欄位,允許冗餘,達到以空間換時間的目的。

2.3.5 正規化化設計和反正規化化設計的優缺點

正規化化

優點: 
1· 可以儘量的減少資料冗餘 
2·資料表更新快體積小 
3·正規化化的更新操作比反正規化化更快 
4·正規化化的表通常比反正規化化更小


缺點: 
1·對於查詢需要對多個表進行關聯,導致效能降低 
2·更難進行索引優化

反正規化化

優點: 
1·可以減少表的關聯 
2·可以更好地進行索引優化

 

缺點 
1·存在資料冗餘及資料維護異常 
2·對資料的修改需要更多成本