詳解資料庫設計中的三大正規化理論

2021-10-07 16:42:42 字數 2743 閱讀 6546

客人編號姓名位址客房號客房描述客房型別客房狀態床位數**入住人數

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 每列都與主鍵有直接關係,不存在傳遞依賴 不符合第一正規化的例子 關聯式資料庫...