1. 程式人生 > >資料庫三大正規化和反正規化

資料庫三大正規化和反正規化

後一個正規化都是在滿足前一個正規化的基礎上建立的.

1NF:無重複的列.表中的每一列都是不可分割的基本資料項.不滿足1NF的資料庫不是關係資料庫.
如聯絡人表(姓名,電話),一個聯絡人有家庭電話和公司電話,則不符合1NF,應拆分為(姓名,家庭電話,公司電話).

2NF:屬性完全依賴於主鍵.不能存在僅依賴於關鍵一部分的屬性.
如選課關係(學號,課程名稱,成績,學分),組合關鍵字(學號,課程名稱)作為主鍵.其不滿足2NF,因為存在決定關係:課程名稱->學分,即存在組合主鍵中的部分欄位決定非主屬性的情況.會導致資料冗餘,更新/插入/刪除異常.

3NF:屬性不傳遞依賴於其它非主屬性.非主鍵列必須直接依賴於主鍵,而不能傳遞依賴。即不能是:非主鍵A依賴於非主鍵B,非主鍵B依賴於主鍵.
如學生表(學號,姓名,學院編號,學院名稱),學號是主鍵,姓名、學院編號、學院名稱都完全依賴於學號,滿足2NF,但不滿足3NF,因為學院名稱直接依賴的是學院編號 ,它是通過傳遞才依賴於主鍵.

正規化可以避免資料冗餘,減少資料庫的空間,減輕維護資料完整性的麻煩.但等級越高的正規化設計出來的表越多,可能會增加查詢所需時間.當我們的業務所涉及的表非常多,經常會有多表連線,並且我們對錶的操作要時間上要儘量的快,這時可以考慮我們使用“反正規化”.也就是用空間來換取時間,把資料冗餘在多個表中,當查詢時可以減少或者是避免表之間的關聯.
比如兩個表(使用者id,好友id)和(使用者id,使用者暱稱,使用者郵箱,聯絡電話)符合3NF,如果需查詢某個使用者的好友(暱稱)名單,此時需對2個表進行連線查詢,可以把第一個表修改成(使用者id,好友id,好友暱稱)這樣只需要查詢第一個表就可獲取所有好友暱稱.