資料庫的建表原則(三大正規化)
阿新 • • 發佈:2018-12-09
資料庫設計三大正規化
為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的正規化。
在實際開發中最為常見的設計正規化有三個:
第一正規化(確保每列保持原子性)
第一正規化是最基本的正規化。
如果資料庫表中的所有欄位值都是不可分解的原子值,就說明該資料庫表滿足了第一正規化。
第一正規化的合理遵循需要根據系統的實際需求來定。
比如:某些資料庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個數據庫表的欄位就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分為省份、城市、詳細地址等多個部分進行儲存,這樣在對地址中某一部分操作的時候將非常方便。這樣設計才算滿足了資料庫的第一正規化,如下表所示。
編號 | 姓名 | 性別 | 年齡 | 聯絡電話 | 省份 | 城市 | 詳細地址 |
---|---|---|---|---|---|---|---|
1 | 張紅欣 | 男 | 26 | 0378-23459876 | 河南 | 開封 | 朝陽區新華路23號 |
2 | 李四平 | 女 | 32 | 0751-65432584 | 廣州 | 廣東 | 白雲區天明路148號 |
3 | 劉志國 | 男 | 21 | 0371-87659852 | 河南 | 鄭州 | 二七區大學路198號 |
4 | 郭小明 | 女 | 27 | 0371-62556789 | 河南 | 鄭州 | 新鄭市薛店北街218號 |
第二正規化(確保表中的每列都和主鍵相關)
簡單地說,第二正規化是指在關係表中,不是主鍵的屬性需要完全依賴於主鍵。
比如要設計一個訂單資訊表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為資料庫表的聯合主鍵,如下表所示:
訂單編號 | 商品編號 | 商品名稱 | 數量 | 單位 | 商品價格 |
---|---|---|---|---|---|
001 | 1 | 挖掘機 | 1 | 臺 | 1200000¥ |
002 | 2 | 衝擊鑽 | 8 | 個 | 230¥ |
003 | 3 | 剷車 | 2 | 輛 | 980000¥ |
第三正規化(確保每列都和主鍵列直接相關,而不是間接相關)
第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。第三正規化的目的是移除那些不是直接功能依賴於主鍵的屬性,這些屬性是藉由另一個屬性來依賴於主鍵的。
比如:在設計一個訂單資料表的時候,可以將客戶編號作為一個外來鍵和訂單表建立相應的關係。而不可以在訂單表中新增關於客戶其它資訊(比如姓名、所屬公司等)的欄位。如下面這兩個表所示的設計就是一個滿足第三正規化的資料庫表。
訂單編號 | 訂單專案 | 負責人 | 業務員 | 訂單數量 | 客戶編號 |
---|---|---|---|---|---|
001 | 挖掘機 | 劉明 | 李東明 | 1臺 | 1 |
002 | 衝擊鑽 | 李剛 | 霍新峰 | 8個 | 2 |
003 | 剷車 | 郭新一 | 艾美麗 | 2輛 | 1 |
客戶編號 | 客戶名稱 | 所屬公司 | 聯絡方式 |
---|---|---|---|
1 | 李聰 | 五一建設 | 13253661015 |
2 | 劉新明 | 個體經營 | 13285746958 |
這樣在查詢訂單資訊的時候,就可以使用客戶編號來引用客戶資訊表中的記錄,也不必在訂單資訊表中多次輸入客戶資訊的內容,減小了資料冗餘。