客人編號姓名位址客房號客房描述客房型別客房狀態床位數**入住人數
c1001
張三addr1
1001
a棟1層
單人間入住
1128
1c1002
李四addr2
2002
b棟2層
標準間入住
2168
1
以第二正規化中的客房資訊表為例,初看時該錶沒得問題,滿足2nf,每列都和主鍵列'客房號'相關,然而細看後發現:
'床位數'列,
'**'列--
>
'客房型別'列
'客房型別'列--
>
'客房號'列
'床位數'列,
'**'列--
>
'客房號'列
為了滿足3nf,應該去掉'床位數'列,
'**'列,
'客房型別'列,將客房資訊表分解為如下兩個表:
'客房表(客房號,客房描述,客戶型別編號,客房狀態,入住人數等)'
'客房型別表(客房型別編號,客房型別名稱,床位數,**)'
又因為第三正規化也是對字段冗餘性的約束,即任何字段不能由其他字段派生出來(除主鍵外,列列無關)
冗餘解釋:
主鍵與外來鍵在多表中的重複出現不屬於資料冗餘,非鍵字段的出現才是資料冗餘
在上述客房表中客房狀態存在冗餘,需要進行規範化,規範化的表如下:
'客房表(客房號,客房描述,客戶型別編號,客房狀態編號,入住人數等)'
'客房狀態表(客房狀態編號,客房狀態名稱)'
第一正規化的要求每列必須是最小的原子單元,即不能再次細分,在這裡位址無需再次分解,可認為滿足第一正規化
第二正規化要求每列都與主鍵相關,不想關的列放到別的表中,要求乙個表只描述一件事情
該錶描述了兩件事情:客人資訊和客房資訊,因此不滿足第二正規化需要拆分
拆分後的兩個表如下:
表2:客人資訊表
客人編號姓名位址
c1001
張三addr1
c1002
李四addr2
表3:客房資訊表
客房號客房描述客房型別客房狀態床位數**入住人數
1001
a棟1層
單人間入住
1128
12002
b棟2層
標準間入住
2168
1
第三正規化要求表中各列必須和主鍵直接相關,不能間接相關,即需要拆分客房資訊表為客房表,客房型別表和客房狀態表,如下:
表4:客房表
客房號客房描述客房型別編號客房狀態入住人數
1001
a棟1層11
12002
b棟2層21
1表5:客房型別表
客房型別編號客房型別名稱床位數**
1單人間
1128
2標準間
2168
表6:客房狀態表
客房狀態編號客房狀態名稱1入住
2空閒3維修
需要提醒的是,對於專案的終端使用者來說,客戶最關心的是方便清晰的結果
在設計資料庫時,設計人員和客戶對資料庫的設計規範化和效能之間存在一定的矛盾,
前面我們通過三大正規化分解出很多個表,為了滿足使用者的需求,最終需要通過這麼多的表之間連線查詢,
獲取使用者需要的資料.插入資料也同樣如此,對於客戶輸入的資料,需要分開插入到這麼多的表
由此可看出,為了滿足三大正規化,資料操作效能會受到相應的影響.所以,在實際的資料庫設計中,
既要考慮三大正規化,避免資料冗餘和各種資料操作異常;也要考慮資料訪問效能.
有時為了減少表之間的連線,提高資料庫訪問效能,
允許適當的資料冗餘列,這可能時最合適的資料庫設計方案--
>以空間換時間的方案
不要輕易地違反資料庫設計的規範化原則若處理的不好,可能會適得其反,適得應用程式執行速度更慢
1nf:列的原子性
2nf:每列必須和主鍵相關
3nf:各列必須與主鍵直接相關,不可間接相關,除主鍵外,其他列不得相關
詳解資料庫設計三大正規化
為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...
資料庫設計三大正規化資料庫設計三大正規化
為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...
簡單理解資料庫三大正規化
書上講了好多,歸結起來3句話 1nf 字段不可分 2nf 有主鍵,非主鍵字段依賴主鍵 3nf 非主鍵字段不能相互依賴 解釋 1nf 原子性 字段不可再分,否則就不是關聯式資料庫 2nf 唯一性 乙個表只說明乙個事物 3nf 每列都與主鍵有直接關係,不存在傳遞依賴 不符合第一正規化的例子 關聯式資料庫...