第一正規化:
第一正規化為了排除每個欄位有重複的組出現,要求每個字段只有乙個值,而其每個記錄都能用用乙個唯一的主鍵來識別。
比如下面這個訂單表
訂單表姓名 購買數量
a 10,20
b 15,15
c 100,40,30
購買數量段存在多個值,這就不符合第一正規化的要求了,購買數量欄位的值要求是單一的,不能夠重複。
姓名 購買數量
a 10
a 20
b 15
b 15
c 100
c 40
c 30
但是這樣還不符合第一正規化的要求,第一正規化還有每個記錄都能用乙個唯一的主鍵來識別。所以:
識別符號id 姓名 購買數量
1 a 10
2 a 20
3 b 15
4 b 15
5 c 100
6 c 40
7 c 30
這樣就符合了第一正規化原則。
下面這個也是違法了第一正規化的列子,雖然乙個字段只有單一值,但用很多個字段來表達乙個事實也是違反第一正規化的:
使用者的愛好表(愛好最多三個)
姓名 愛好1愛好
2 愛好3
a 看電影 桌球 吃
b 籃球 看書 聽歌
c 羽毛球 看電影 寫**
d 桌球 看電影
總結一下就是:所謂的第一正規化,就是資料庫表中的每一列都是不可分割的基本資料項,即所有欄位都是原子級的,每一項記錄要有乙個唯一識別碼。
我們要如何設計出符合第一正規化的的原則的表:既然我們的每乙個列要求不可再分,當我們設計過程中出現了每一列出現多值的情況下的時候,我們要定義乙個新的實體,這個新的實體儲存這些重複的屬性。這樣設計只有原實體和新實體之間就是一對多的關係了。
說明:第乙個正規化是關係型資料庫的最基本的要求,不符合第一正規化,就不是關係型資料庫。
第二正規化:
有了第一正規化也是不夠的,比如這個表(學號,學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**),存在下面這種依賴關係:
(學號)→ (姓名, 年齡,性別,系別,系辦位址、系辦**)
(課程名稱) → (學分)
(學號,課程)→ (學科成績)
這樣就會出現:
資料冗餘:同乙個課程有n個學生修,則學分會重複n-1次。同乙個學生修了m門課程,則姓名和年齡會重複m-1次。
更新異常:如果想調整一門課的學分,那麼要把所有的學分值進行更新。如果要加入一門新的課程,但是這門課還沒人選,但是沒有學號關鍵字,所以課程和學分無法錄入表中。
刪除異常:如果一批學生已經修完一門課程,這些選修的記錄被刪除之後,同時課程和學分的記錄也被刪除了。顯然,這樣會導致插入異常。
所以我們還需要第二正規化。
第二正規化要求,首先要符合第一正規化,然後是所有資料都和主鍵有唯一的依賴關係,如果存在部分關係,那麼這些資料要單獨設計在另乙個表中。
比如下面這個例子:
id 商品id 商品名稱 ** 地區 數量總價
1 1 a 1000 杭州1 1000
2 2 b 600 深圳2 1200
3 3 c 800 上海1 800
4 4 d 1200 深圳2 2400
這裡,比如商品id和id一起組合形成乙個主鍵,而商品名稱和位址只和商品
id有依賴關係(部分依賴),這就不符合第二正規化的原則了。
所以最好把這些資料存到另乙個表中。
id 商品名稱 ** 地區
1 a 1000 杭州
2 b 600 深圳
3 c 800 上海
4 d 1200 深圳
然後原來的表就變成這樣了。
id 商品id 數量 總價
1 1 1 1000
2 2 2 1200
3 3 1 800
4 4 2 2400
總結一下就是:首先要符合第一正規化,然後是所有屬性都和主鍵有完全的依賴關係,不存在只依賴一部分的情況。
符合第二正規化的表我們如何設計呢?如果有部分依賴的情況,我們應當將這一部分分出來,用乙個新的實體表示。然後新的實體和原來的實體是一對多的關係。
第三正規化:
所有非鍵屬性都之和候選鍵有相關性,也就是說,非鍵屬性之間應該是無關的。簡單的說,就是乙個資料庫的表中,不能包含在其它表中已經存在其他表中的非主鍵屬性的關鍵字資訊。
比如這個表:
student(學號, 姓名, 年齡, 所在學院, 學院地點, 學院**),關鍵字為單一關鍵字"學號",因為存在如下決定關係:
(學號) → (姓名, 年齡, 所在學院, 學院地點, 學院**)
(學院)->(
所在學院, 學院地點, 學院**)
那麼這裡就存在了(
所在學院, 學院地點, 學院**
)對學號的傳遞依賴。
即第三正規化不能存在(關鍵字段-》非關鍵字段x-》非關鍵字段x)這樣的傳遞依賴。
這樣的傳遞依賴也會存在
資料冗餘
、更新異常
、刪除異常。
這樣我們的設計表的時候,要注意,如果出現這種情況,那麼我們把那些傳遞依賴的屬性弄乙個新的表。這樣可以有效地消除了冗餘,不會出現更新異常,插入異常,刪除異常等問題。
總結一下就是:非鍵屬性之間應該是無關的,不能出現傳遞依賴。
關於第二正規化、第三正規化感覺好容易混淆。關鍵性的區別是:
第二正規化,非主鍵屬性要完全依賴於主鍵屬性,不能只依賴主鍵的一部分。
第三正規化,不能出現傳遞依賴,也就是說非主屬性之間是沒有關聯的,傳遞依賴即非主鍵1
依賴主鍵,非主鍵
2依賴非主鍵1。
還有第一正規化就是,每一列都是原子的不可分割的屬性,
每一項記錄要有乙個唯一識別碼。
資料庫正規化 三正規化
所謂第一正規化 1nf 是指在關係模型中,對域新增的乙個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化 1nf 表中的每個域值只能是實體的乙個屬性或乙個屬性的...
資料庫三正規化
資料庫的三正規化 1n 關係r中的屬性都是不可分割的項.2n 在1n的基礎上,每個非主屬性完全函式依賴於碼.3n 在2n的基礎上,每乙個非主屬性既不部分依賴於碼也不傳遞依賴於碼.1n 消除非主屬性對碼的部分函式依賴 2n 消除非主屬性對碼的傳遞函式依賴 3n 消除主屬性對碼的部分和傳遞函式依賴 bc...
資料庫三正規化
1 第一正規化 1nf 無重複的列 所謂第一正規化 1nf 是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義乙個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化 ...