數據庫設計爲什麼要使用三大範式?

2020-08-08 14:48:37
我們在《數據庫設計的三大範式》一節講解了三大範式,本節主要介紹不使用三大範式會對設計數據庫有什麼影響,會出現什麼問題。

這裏可以將三大範式理解爲:設計數據庫時需要遵循的規則,可以有效的幫助我們建立冗餘小且結構合理的數據庫。

在概要設計階段,同一個專案,10 個設計人員可能設計出 10 種不同的  E-R 圖。不同的角度可以標識出不同的實體,實體又包括不同的屬性,自然就設計出了不同的 E-R圖。那麼怎樣審覈這些設計圖呢?如何評審出最優的設計方案呢?答案就藏在後面的內容裡。

下面 下麪以某酒店的客人住宿資訊表爲例來介紹,該表用於儲存酒店提供住宿的客房資訊,如表 1 所示。

表 1 客人住宿資訊表
客人編號 姓名 地址 客房號 ... 客房描述 客房型別 客房狀態 牀位數 價格 入住人數
C1001 張三 Addr1 1001 ... A棟1層 單人間 入住 1 128.00 1
C1002 李四 Addr2 2002 ... B棟2層 標準間 入住 2 158.00 2
C1003 王五 Addr3 2002 ... B棟2層 標準間 入住 2 168.00 2
... ... ... ... ... ... ... ... ... ... ...
C8006 A1 Addrm   8006 C棟3層 總統套房 入住 3 1080.00 3
C8008 A2 Addrn ..... 8008 C棟3層 總統套房 空閒 3 1080.00 0

從使用者的角度來說,將所有資訊放在一個表中很方便,因爲這樣查詢數據庫可能會比較容易,但是上述表具有下列問題。

1. 資訊重複(冗餘)

上表中“客房型別”“客房狀態”和“牀位數”列中有許多重複的資訊,如“標準間”“入住”等。資訊重複會造成儲存空間的浪費及一些其他的問題。比如,不小心輸入了“標準間”和“標間”或“總統套房”和“總統套”,那麼它們在數據庫中將表示四種不同的客房型別。

2. 更新異常

冗餘資訊不僅浪費儲存空間,還會增加更新的難度。如果需要將“客房型別”修改爲“標間”而不是“標準間”,則需要修改所有包含該值的行。如果由於某種原因,沒有更新所有行,那麼數據庫中會出現兩種客房型別,一個是“標準間”,另一個是“標間”,這種情況被稱爲更新異常。

3. 插入異常(無法表示某些資訊)

從表 1 中我們會發現 2002 和 2003 客房的居住價格分別是 168 元和 158 元。儘管這兩間客房都是標準間型別,但它們的“價格”出現了不同,這樣就造成了同一個酒店相同類型的客房價格不同,這種問題被稱爲插入異常。

4. 刪除異常(丟失有用的資訊)

在某些情況下,當刪除一行時,可能會丟失有用的資訊。例如,如果刪除客房型別爲“1001”的行,就會丟失客房型別爲“單人間”的賬戶的資訊,該表只剩下兩種客房型別,即“標準間”和“總統套房”。當查詢有哪些客房型別時,將會誤以爲只有“標準間”和“總統套房”兩種客房型別,這種情況被稱爲刪除異常。