資料庫三正規化

2021-08-27 22:37:14 字數 3330 閱讀 6592

第一正規化:

第一正規化為了排除每個欄位有重複的組出現,要求每個字段只有乙個值,而其每個記錄都能用用乙個唯一的主鍵來識別。

比如下面這個訂單表

訂單表姓名                購買數量

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 是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義乙個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化 ...