我們在《
數據庫設計的三大範式》一節講解了三大範式,本節主要介紹不使用三大範式會對設計數據庫有什麼影響,會出現什麼問題。
這裏可以將三大範式理解爲:設計數據庫時需要遵循的規則,可以有效的幫助我們建立冗餘小且結構合理的數據庫。
在概要設計階段,同一個專案,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”的行,就會丟失客房型別爲“單人間”的賬戶的資訊,該表只剩下兩種客房型別,即“標準間”和“總統套房”。當查詢有哪些客房型別時,將會誤以爲只有“標準間”和“總統套房”兩種客房型別,這種情況被稱爲刪除異常。