標準化表示從你的資料儲存中移去資料冗餘(redundancy)的過程。如果資料庫設計達到了完全的標準化,則把所有的表通過關鍵字連線在一起時,不會出現任何資料的複本(repetition)。標準化的優點是明顯的,它避免了資料冗餘,自然就節省了空間,也對資料的一致性(consistency)提供了根本的保障,杜絕了資料不一致的現象,同時也提高了效率。
1. 主關鍵字段在表中是唯一的
2. 主關鍵字段中沒有複本
3. 主關鍵字段不能存在空值
4. 每條記錄都必須有乙個主關鍵字
5. 主關鍵字是關鍵字的最小子集
滿足1nf的關係模式有許多不必要的重複值,並且增加了修改其資料時疏漏的可能性。為了避免這種資料冗餘和更新資料的遺漏,就引出了第二正規化(2nf)。
為了說明問題現舉乙個例子來說明:有乙個庫房儲存的庫有四個字段(零件號碼,倉庫號碼,零件數量,倉庫位址),
這個庫符合1nf,其中「零件號碼」和「倉庫號碼」構成主關鍵字。
但是因為「倉庫位址」只完全依賴與「倉庫號碼」,即只依賴於主關鍵字的一部分,所以它不符合2nf,
這樣首先存在資料冗餘,因為倉庫數量可能不多。
其次,存在如果更改倉庫位址時,如果漏改了某一記錄,存在資料不一致性。
再次,如果某個倉庫的零件出完了,那麼這個倉庫位址就丟失了,即這種關係不允許存在某個倉庫中不放零件的情況。
我們可以用投影分解的方法消除部分依賴的情況,而使關係達到2nf的標準。
方法是從關係中分解出新的二維表,是每個二維表中所有的非關鍵字都完全依賴於各自的主關鍵字。
我們可以如下分解:分解成兩個表(零件號碼,倉庫號碼,零件數量)和(倉庫號碼,倉庫位址)。
這樣就完全符合2nf了。
從2nf中消除傳遞依賴,就是3nf。比如有乙個表(姓名,工資等級,工資額),其中姓名是關鍵字,
此關係符合2nf,但是因為工資等級決定工資額,這就叫傳遞依賴,它不符合3nf,
我們同樣可以使用投影分解的辦法分解成兩個表:(姓名,工資等級),
(工資等級,工資額)。
一般情況,規範化到3nf就滿足需要了,規範化程度更高的還有bcnf,4nf,5nf,因為不常用,不作解釋和討論。它們下層都是上層的子集,規範辦法是:1nf(消除非主屬性對關鍵字的部分函式依賴)2nf(消除非主屬性對關鍵字的傳遞函式依賴)3nf(消除主屬性對關鍵字的部分和傳遞依賴)bcnf(消除非平凡且非函式依賴的多值依賴)4nf(消除不為候選關鍵字所隱含的連線依賴)。
投影分解
上面提到了投影分解方法,關係模式的規範化過程是通過投影分解來實現的。這種把低一級關係模式分解成若干高一級關係模式的投影分解不是唯一的,應在分解中注意滿足三個條件:
1. 無損連線分解,分解後不丟失資訊
2. 分解後得的每一關係都是高一級正規化,不要同級甚至低階分解
3. 分解的個數最少,這是完美要求,應做到盡量少。
規範化的利弊
有一利必有一弊。規範化的優點是明顯的。他避免了大量的資料冗餘,節省了空間,保持了資料的一致性,
如果完全達到3nf,你不會在超過乙個地方更改同乙個值。如果你的記錄經常的改變,這個優點回超過所有可能的缺點!
它最大的不利是,你把資訊放置在不同的表中,增加了操作的難度,同時把多個表連線在一起的花費也是巨大
的。因為表和表的連線操作是做兩個關係的笛卡兒積(如果表一n條記錄,表二m條記錄,如果沒有任何連線條件的話,連線在一起就是n*m條記錄,其數量是不可承受的,毋寧說大量的表連線在一起了),必然會產生大量無用甚至無效的記錄,效能的代價是巨大的。
非規範化(denormalization)
即使你花費你所有的午休時間,作出乙個完全規範化的資料庫(你的大學教授可以證明),它仍然不是完美的。規範化設計所帶來的效能問題可能你無法承受。如果出現這種情況,你就要準備進行非規範化了。非規範化就是你為了獲得效能上的利益所進行的違反規範化規則的操作,並沒有什麼魔法在裡面。它是乙個效能利益分析,嘗試和再嘗試和不斷的再評估過程。它也有很多方法,不過大部分都與實際應用有關係,包括複製屬性,複製外來關鍵字,表合併,表重新組合等等,你可以根據實際的應用選擇最有效的方法。
資料庫設計三大正規化資料庫設計三大正規化
為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...
資料庫設計三大正規化
為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...
資料庫設計三大正規化
為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...