資料庫正規化

2021-04-13 21:34:42 字數 4182 閱讀 2195

注:

表在定義中被稱為關係,記作r

欄位在定義中被稱作屬性

模式:資料庫中有三種模式,外模式,內模式,模式

粗體是關鍵字的意思

斜體為外來鍵

以前寫下來的,但是用了多年的帳號已經忘了,唯有把文章轉到這裡來了~,真暈哦~ http://blog.csdn.net/fantasylu/archive/2004/07/20/45794.aspx

第一正規化

定義:如果關係r 中所有屬性的值域都是單純域,那麼關係模式r是第一正規化的

那麼符合第一模式的特點就有

1)有主關鍵字

2)主鍵不能為空,

3)主鍵不能重複,

4)欄位不可以再分

例如:studyno   |name   |   ***   |   contact

20040901      john         male      email:[email protected],phone:222456

20040901      mary         famale   email:[email protected] phone:123455

以上的表就不符合,第一正規化:主鍵重複(實際中資料庫不允許重複的),而且contact欄位可以再分

所以變更為正確的是

studyno   |name   |   ***   |      email         |      phone

20040901      john         male       [email protected]  222456

20040902     mary         famale    [email protected]    123455

第二正規化:

定義:如果關係模式r是第一正規化的,而且關係中每乙個非主屬性不部分依賴於主鍵,稱r是第二正規化的。

所以第二正規化的主要任務就是

滿足第一正規化的前提下,消除部分函式依賴。

studyno   |name   |   ***   |         email         |      phone    |classno| classaddress

01                  john        male       [email protected]     222456      200401            a樓2

01                   mary       famale    [email protected]       123455      200402            a樓3

這個表完全滿足於第一正規化,

主鍵由studyno和classno組成,這樣才能定位到指定行

但是,classaddress部分依賴於關鍵字(classno-〉classaddress),

所以要變為兩個表

表一studyno   |name   |   ***   |      email         |      phone |   classno

01            john         male       [email protected]  222456   200401      

01           mary         famale    [email protected]    123455      200402     

表二classno| classaddress

200401      a樓2

200402      a樓3

第三正規化:

滿足第二正規化的前提下,消除傳遞依賴。 例:

studyno   |name   |   ***   |      email         |      bounslevel   |   bouns

20040901      john         male       [email protected]   優秀                    $1000

20040902     mary         famale    [email protected]       良                         $600

這個完全滿足了第二正規化,但是bounslevel和bouns存在傳遞依賴

更改為:

studyno   |name   |   ***   |      email         |      bouunsno

20040901      john         male       [email protected]   1

20040902     mary         famale    [email protected]       2

bounsno|   bounslevel   |   bouns

1                   優秀                $1000

2                 良                   $600

這裡我比較喜歡用bounsno作為主鍵,

基於兩個原因

1)不要用字元作為主鍵。可能有人說:如果我的等級一開始就用數值就代替呢?

2)但是如果等級名稱更改了,不叫 1,2 ,3或優、良,這樣就可以方便更改,所以我一般優先使用與業務無關的字段作為關鍵字。

一般滿足前三個正規化就可以避免資料冗餘。

第四正規化:

主要任務:滿足第三正規化的前提下,消除多值依賴

product   |agent|factory

car            a1        f1

bus           a1         f2

car            a2         f2

在這裡,car的定位,必須由 agent 和 factory才能得到(所以主鍵由agent和factory組成),可以通過 product依賴了agent和factory兩個屬性

所以正確的是

表1                              表2:

product   |   agent            factory  |   product

car            a1                  f1            car

bus            a1                  f2            car

car            a2                  f2             bus

第五正規化:

定義:如果關係模式r中的每乙個連線依賴, 都是由r的候選鍵所蘊含, 稱r是第五正規化的

看到定義,就知道是要消除連線依賴,並且必須保證資料完整

例子a|b|c

a1      b1   c1

a2      b1   c2

a1      b2  c1

a2      b2   c2

如果要定位到特定行,必須三個屬性都為關鍵字。

所以關係要變為 三個關係,分別是a 和b,b和c ,c和a

如下:表1                      表2                  表3

a   |   b               b   |   c         c    |    a

a1      b1            b1      c1         c1      a1            

a1      b2            b1      c2         c1      a2

正規化可以避免資料冗餘,減少資料庫的空間,減輕維護資料完整性的麻煩,但是操作難,因為需要聯絡多個表才能得到所需要資料,而且越高正規化效能就會越差。要權衡是否使用更高正規化是比較麻煩。

一般我在做專案中都,用得最多的也就是第三正規化,我認為使用到第三正規化也就足夠了,效能好

而且方便管理資料

資料庫 資料庫正規化

關聯式資料庫的設計規範。不同的規範要求被稱為不同的正規化,越高的正規化資料庫冗餘越小。減少資料庫中資料冗餘的過程 1 第一正規化 1nf 在關係模式r中,當且僅當所有屬性只包含原子值,即每個分量都是不可再分的資料項,則稱r滿足1nf。例如表所示的教師職稱情況關係就不滿足1nf。原因在於,該關係模式中...

資料庫正規化 三正規化

所謂第一正規化 1nf 是指在關係模型中,對域新增的乙個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化 1nf 表中的每個域值只能是實體的乙個屬性或乙個屬性的...

資料庫 正規化

今天要說一點就是我大學好像過得挺失敗的,因為在那一大堆的公式面前我從來沒有搞清楚過正規化,經過大量的背誦好像也是似懂非懂。看來,大學課本要避免一點的就是不要用公式去說明問題,用簡潔的語句更容易明白。工作中這兩年做的資料庫設計也不少,反回來看這樣公式說明的正規化還是不明白。在網上搜了一點,一下就明白了...