資料庫面試題——正規化
1、範數的定義
在設計資料庫時,為了使其冗餘較小、結構合理,設計資料庫時必須遵循一定的規則。在關係型資料庫中,這種規則被稱為範數。範數是符合某一設計規則的總結。
2、實際開發中的常見正規化
(1)第一正規化
定義:
資料庫表中的所有欄位值都是不可分割的原子值。
非第一正規化舉例:
原因:高三年1班含有年級和班級資訊,可繼續拆分,為非原子資訊。
改:
(2)第二正規化:
定義:
資料庫表中的每一列都與主鍵完全相關,而不能只與主鍵的部分相關。
例子:
假定選課關係表為SelectCourse(學號, 姓名, 年齡, 課程名稱, 成績, 學分),主鍵為屬性組(學號, 課程名稱),因為存在如下決定關係
(學號, 課程名稱) → (姓名, 年齡, 成績, 學分)
這個資料庫表不滿足第二正規化,因為存在如下決定關係:
(課程名稱) → (學分)
(學號) → (姓名, 年齡)
即非主屬性依賴於主鍵的一部分(如學分只依賴於課程名稱,而不是學號和課程名稱)。
改:
把選課關係表SelectCourse改為如下三個表:
學生:Student(學號, 姓名, 年齡);
課程:Course(課程名稱, 學分);
選課關係:SelectCourse(學號, 課程名稱, 成績)。
就符合了第二正規化。
(3)第三正規化:
定義:
資料庫表中的每一列和主鍵直接相關,而不是間接相關。也就是屬性不能傳遞依賴於主屬性。
例子:
假定學生關係表為Student(學號, 姓名, 年齡, 所在學院, 學院地點, 學院電話),關鍵字為單一關鍵字"學號",因為存在如下決定關係
(學號) → (姓名, 年齡, 所在學院, 學院地點, 學院電話)
這個資料庫是符合2NF的,但是不符合3NF,因為存在如下決定關係
(學號) → (所在學院) → (學院地點, 學院電話)
改:
把學生關係表分為如下兩個表
學生:(學號, 姓名, 年齡, 所在學院);
學院:(學院, 地點, 電話)。