正規化 Normalization
正規化的目的 決定是否需要再切割成較小的關聯表 減少關聯表重複的儲存空間 避免更新異常 新增異常 刪除異常 修改異常 新增某些資料時必須同時新增其他的資料 刪除異常 刪除某些資料時必須同時刪除其他的資料 修改異常 修改某些資料時必須一併修改其他的資料
階層式的正規化格式 第一階正規化格式(1NF) 第二階正規化格式(2NF) 第三階正規化格式(3NF) Boyce-Codd正規化格式(BCNF) 階層式限制 是BCNF則是3NF 是3NF則是2NF 是2NF則是1NF
功能相依 功能相依(函數相依,functional dependency) 完全功能相依 關聯表R中兩組屬性X及Y X → Y表示X在功能上決定Y或Y功能相依於X 對R中的任何兩個值組r1及r2,如果 r1[X] = r2[X] 則 r1[Y] = r2[Y] 完全功能相依 如果由X中移除任何屬性X → Y就不成立
1NF 1NF的定義 關聯表定義的一部分 下列的班級關聯表就不是1NF 班級編號 導師編號 教室 C303 T17 {A102, C301} 屬性值只能是不可分割的單一值 關聯表定義的一部分 下列的班級關聯表就不是1NF 班級編號 導師編號 教室 C303 T17 {A102, C301} C402 T23 B202
2NF 2NF的定義 不是2NF的例子 是1NF 所有不屬於任何鍵的屬性都沒有部分相依於任何鍵 學生-老師 (學號, 老師編號, 面談日期, 學生姓名, 老師姓名) FD1: 學號 → 學生姓名 FD2: 老師編號 → 老師姓名 FD3: {學號,老師編號} → 面談日期
2NF 切割成2NF 學生 (學號, 學生姓名) FD1: 學號 → 學生姓名 老師 (老師編號, 老師姓名) 面談 (學號, 老師編號, 面談日期) FD3: {學號,老師編號} → 面談日期
3NF 3NF的定義 不是3NF的例子 是2NF X → Y 是任何一個功能相依則 學生-老師 (學號, 學生姓名, 導師編號, 老師姓名) FD1: 學號 → {學生姓名, 導師編號} FD2: 導師編號 → 老師姓名
3NF 分割成3NF的關聯表 學生 (學號, 學生姓名, 導師編號) FD1: 學號 → {學生姓名, 導師編號} 老師 (導師編號, 老師姓名) FD2: 導師編號 → 老師姓名
BCNF BCNF的定義 是3NF但不是BCNF的例子 是3NF X → Y 是任何一個功能相依則X是鍵 R (A, B, C) FD1: {A, B} → C FD2: C → B
BCNF 不是BCNF的例子 分割成BCNF的關聯表 FD2消失了 R (A, B, C, D) FD1: A → {B, C, D} FD2: {B, C} → {A, D} FD3: D → B 分割成BCNF的關聯表 R1 (A, C, D) FD1: A → {C, D} R2(D, B) FD2消失了
反正規化 為了增加效能,在綱要中增加不必要的屬性或關聯 向下反正規化:父屬性加到子關聯 向上反正規化:子關聯的摘要加到父關聯 關聯內反正規化:新增屬性(Z=X+Y) 切割反正規化 合併反正規化