COPYRIGHT CH CHAN 2008


Creative Commons License


This work is licensed under a
Creative Commons Attribution-Share Alike 3.0 Unported License.
以中文寫多次。如要轉載請標示本文作者及以同樣的 CC Attribution-Share Alike 再發表。

-------------------------------
nor51.png

上次做完了 1NF ,今次進入第二部曲,就是叫做 2NF 。
2NF 用人話講,是希望降低數據重覆的可能性,只能解決之前的 Fever, FeVR 問題。
我們看看 Diseases 這個 Table 。每一個病症的名稱重覆得太多次,除了浪費儲存空間之外,也增加打錯字機會。而要將所有有發燒的人 update 成另一種病症,也需要修改多次。如果我們見到數據很多重覆,有點像多項選擇題的情況,我們要將它們抽出來。像下圖。
nor6.png

假定我們要將所有 Fever 的人改成 SARS ,我們只需要更新 DiseaseNames 這個 Table 便可。
話雖如此,正規化會增加數據庫的複雜性。在處理性別問題時,我們要考慮這一點。我們絕對可以根據 2NF 要求將亂到不知所謂的 Gender 抽出來。但這個世界,人除了男之外就是女。 ((當然還有中性、無性、變性等等,這是後話)) 一般的數據庫書本都反對將性別抽出來,這是 Gone too far 。多數會使用輸入限制及教育數據輸入者改善打錯的問題。日後講到 SQL 時會再討論。暫且假定我們已經解決性別的問題。如下圖。
nor7.png
第三部曲, 3NF ,是每個 Table 的每一個直行輸入的數據應該只與 Primary Key 有關,而不是與其他非 Key 類數據有關。例如 Patients 這個 Table 。病人名、病人性別以及該病人覆診的醫院,都是依賴 PatID 。可是醫院的地區,只是與醫院有關,基本上你知道那一間醫院,你就知道那一個地區。所以醫院地區這個直行應該從 Patients 這個 Table 刪除。
nor8.png
難保日後會出現醫院改名(也防止打錯醫院名),我們也真的想記下醫院區域,我們也將醫院的資料抽出來。
nor9.png
這個就是經過正規化後的數據庫設計。其實還有 4NF 之類之類,但那些我們暫不討論。有機會會講下 CRI 201 ,叫做 SQL 應用。一般人想到數據庫第一答案是 Access 、 FileMaker 。 FileMaker 還好, Access 就真係咪搞。所以我們會討論開放源碼的 SQLite 的應用。