首先我們要了解什麼是正規化,可以簡單的理解為規範。正式一點的概念是:**正規化是符合某一設計要求的總結,要想設計出乙個結構合理的關係型資料庫,就必須要滿足一定的正規化。**我們為了建立冗餘較小、結構合理的資料庫,所以在資料庫設計時必須遵循一定的規則,而我們把在關係型資料庫中的這種規則稱為正規化。注意,正規化只適用於關係型資料庫。
在實際開發的過程中,我們用的比較多的是三大正規化,當然還有反三正規化,這裡不做討論。三大正規化的概念如下:
第一正規化(1nf):每列具有原子性,即不可分割。
注意:只有先滿足1nf,才能滿足2nf,只有先滿足2nf,才能滿足3nf,也就是說越來越嚴格,2nf比1nf嚴格,3nf比2nf嚴格。
上面說到了三正規化的內容,下面談一下三正規化的簡單理解。
1、第一正規化(1nf)
第一正規化是表中的列具有原子性,必須是不可分割的最小單元。舉乙個簡單的例子,我們在設計表時常用到位址這個字段,如下:
如果我們要經常訪問位址中的城市,比如黃岡、武漢、渝北這些值,那麼以上的表就可能就不能很好的滿足要求了,這時可以將位址具體拆分為省份和城市,甚至是詳細位址,這樣的話在訪問資料表的時候效能就非常的高了。如下:
將位址字段重新拆分成省份、城市、詳細位址的話,就可以單獨的訪問位址中的某個值了,這樣的設計滿足第一正規化,這樣在訪問資料庫的時候大大提高了效能。
2、第二正規化(2nf)
第二正規化在滿足第一正規化的基礎上更進一步,要求表中的每一列都和主鍵相關,每一列都要依賴於主鍵。不能存在和主鍵沒有關係的列,也就是說一張表只描述一件事情,只存在一種資料,不能把多種資料存放在同一張表中,舉個例子:訂單表中只描述訂單相關的資料,商品表中只描述商品,不能把商品的相關資料放在訂單表中,如下:
上面表的設計就不滿足第二正規化,這張表中存放了訂單資料和商品資料,很明顯這樣是不合理的,訂單表中只能存放訂單資料,商品表中只存放商品資料,這樣才合理,可以將上表拆分為訂單表和商品表,訂單表中只放訂單相關的資料,商品表中只存放商品相關的資料。訂單表如下:
如上訂單表中只存放與訂單有關的資料,如客戶名稱、送貨位址、**等資訊。
而商品表中只存放商品相關資訊:如下:
訂單表和商品表必須要關聯起來,所以新增乙個關聯的表,如下:
關聯表中只存放訂單id、商品id、商品數量這3列資料。
查詢的時候只需將訂單表、商品表、訂單商品表這3張表進行關聯就行了,sql如下:
select
distinct
d4.order_id 訂單編號,d4.account_name 客戶名稱,d4.receive_address 收穫位址,
d5.s_name 商品名稱,d6.s_number 數量,d5.s_price*d6.s_number 商品小計
from d4
inner
join d6
on d4.order_id = d6.order_id
inner
join d5
on d5.s_id = d6.s_id;
查詢結果如下:
3、第三正規化(3nf)
第三正規化在滿足第二正規化的基礎上更嚴格一點,確保表中的每列和主鍵直接相關,而不是間接相關,可以理解為消除依賴之間的傳遞關係,也就是消除冗餘資訊,第三正規化要求資料庫表中不能包含已在其他表中存在的非主關鍵字資訊。比如上面的訂單表中,將訂單表繼續拆分,將顧客資訊分離出去,重新建立一張顧客表,只存顧客相關資訊,而在訂單表中值只保留訂單id和客戶id,如下:
新增的客戶表中只保留客戶相關資訊,客戶id作為主鍵,包含客戶名稱、送貨位址、****等資訊。如下:
查詢的時候只需將訂單表、客戶表、商品表、訂單商品表這4張表進行關聯即可,sql如下:
select
distinct
d4.order_id 訂單編號,d7.account_name 客戶名稱,d7.receive_address 收穫位址,d7.phone ****,
d5.s_name 商品名稱,d6.s_number 數量,d5.s_price*d6.s_number 商品小計
from d4
inner
join d6
on d4.order_id = d6.order_id
inner
join d5
on d5.s_id = d6.s_id
inner
join d7
on d7.id = d4.account_id;
查詢結果如下:
可以簡單的做乙個小結:
第1正規化是表中的列不能再次進行分割,即每一列必須是不可分割的最小單元。
第2正規化是一張表中包含了不同的屬性資料,必須要進行分表,將不同屬性的資料存放到不同的表中。
第3正規化是已經在第2正規化的基礎上進行了分表,在一張表中只能包含另一張表中的主鍵id,不能包含其他資訊。
區分1nf和2nf的關鍵是是否分表。
區分2nf和3nf的關鍵是分表後表中是否只包含另一張表中的主鍵,而不含其他的資訊。
一起學習,一起進步,每天只要進步一點點,時間久了,就是質的飛躍。
資料庫設計三大正規化資料庫設計三大正規化
為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 1 第一正規化 確保每列保持原子性 第一正規化是最基本的正規化...
資料庫三大正規化
1 第一正規化 1nf 在任何乙個關聯式資料庫中,第一正規化 1nf 是對關係模式的基本要求,不滿足第一正規化 1nf 的資料庫就不是關聯式資料庫。所謂第一正規化 1nf 是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現...
資料庫三大正規化
第一正規化 確保每列的原子性.如果每列 或者每個屬性 都是不可再分的最小資料單元 也稱為最小的原子單元 則滿足第一正規化.例如 顧客表 姓名 編號 位址 其中 位址 列還可以細分為國家 省 市 區等。第二正規化 在第一正規化的基礎上更進一層,目標是確保表中的每列都和主鍵相關.如果乙個關係滿足第一正規...