三正規化面試的時候問的比較多,概念需要了解下:
資料庫設計三大正規化
為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。
第一正規化(確保每列保持原子性);
第二正規化(確保表中的每列都和主鍵相關);
第三正規化(確保每列都和主鍵列直接相關,而不是間接相關);
在實際開發中最為常見的設計正規化有三個:
第一正規化(1nf):要求資料庫表的每一列都是不可分割的原子資料項。
第一正規化是最基本的正規化。如果資料庫表中的所有字段值都是不可分解的原子值,就說明該資料庫表滿足了第一正規化。
第一正規化的合理遵循需要根據系統的實際需求來定。比如某些資料庫系統中需要用到「位址」這個屬性,本來直接將「位址」屬性設計成乙個資料庫表的字段就行。但是如果系統經常會訪問「位址」屬性中的「城市」部分,那麼就非要將「位址」這個屬性重新拆分為省份、城市、詳細位址等多個部分進行儲存,這樣在對位址中某一部分操作的時候將非常方便。這樣設計才算滿足了資料庫的第一正規化,如下表所示。
舉例說明:
在上面的表中,「家庭資訊」和「學校資訊」列均不滿足原子性的要求,故不滿足第一正規化,調整如下:
可見,調整後的每一列都是不可再分的,因此滿足第一正規化(1nf);
第二正規化(2nf):第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。
在1nf的基礎上,非碼屬性必須完全依賴於候選碼(在1nf基礎上消除非主屬性對主碼的部分函式依賴)。**
也就是說在乙個資料庫表中,乙個表中只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中**。
舉例說明:
在上圖所示的情況中,同乙個訂單中可能包含不同的產品,因此主鍵必須是「訂單號」和「產品號」聯合組成,但可以發現,產品數量、產品折扣、產品**與「訂單號」和「產品號」都相關,但是訂單金額和訂單時間僅與「訂單號」相關,與「產品號」無關,
這樣就不滿足第二正規化的要求,調整如下,需分成兩個表:
第三正規化(3nf):第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。
在2nf基礎上,任何非主屬性不依賴於其它非主屬性(在2nf基礎上消除傳遞依賴)
舉例說明:
上表中,所有屬性都完全依賴於學號,所以滿足第二正規化,但是「班主任性別」和「班主任年齡」直接依賴的是「班主任姓名」,
而不是主鍵「學號」,所以需做如下調整:
這樣以來,就滿足了第三正規化的要求。
資料庫 第三正規化(3NF)
第三正規化的表需要滿足以下條件 create table customers cust id int not null,cust name varchar 20 not null,dob date,street varchar 200 city varchar 100 state varchar 1...
(二)資料庫正規化3NF簡解
表 實體 字段 列 屬性 3nf設計原則 和 表關係 1 第一正規化 1nf 字段 字段原子性。最小的實際意義的文字單元指資料庫表的每一列都是不可分割的基本資料項,屬性 不可分割,不可二義!2 第二正規化 2nf 表 行的原子性,元組 表,實體的原子性。資料庫表中的每個例項或行必須可以被唯一地區分。...
第三正規化 3NF 定義
3nf建立在2nf之上,它要求所有的非主鍵列都必需直接依賴於主鍵,不包括任何傳遞依賴 transitive dependency 這裡的傳遞依賴指的是從a b,b c,所以可以從a c。具體含意參見以下示例。舉例來說明,比如有課程student表如下所示。student 表 學生編號 學生姓名 戶口...