目錄
基礎知識:
一、第一正規化:每一列都是不可分割的原子資料項
存在問題:
二、第二正規化:在第一正規化的基礎上,非碼屬性必須完全依賴於碼
三、第三正規化:在第二正規化的基礎上,消除傳遞依賴
四、表與表之間的對應關係
1. 多對一
2. 多對多
設計資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化。常用的有第一正規化,第二正規化,第三正規化,越高的正規化資料庫冗餘越小。
是不是感覺看不懂:下面介紹一下基礎知識
1.函式依賴:a-->b,如果通過a屬性(屬性組)的值,可以唯一確定b屬性的值,則稱b依賴於a。[屬性即資料表的列欄位]
如:學號--->姓名,(學號,課程名稱)--->分數
2.完全函式依賴:a--->b,如果a是乙個屬性組,則b屬性值的確定需要依賴於a屬性組中所有的屬性值。
如:(學號,課程名稱)--->分數
3.部分函式依賴:a--->b,如果a是乙個屬性組,則b屬性的確定只需依賴於a屬性組中的某一些值即可。
4.傳遞依賴:a-->b,b-->c,如果通過a屬性(屬性組)的值,可以確認唯一b屬性的值,再通過b屬性(屬性值)可以唯一確認c屬性的值,那麼c傳遞依賴於a。
5.碼:如果在一張表中,乙個屬性或屬性組,被其他所有屬性所完全依賴,則這個屬性(屬性組)為該錶的碼。
主屬性:碼屬性組中的所有屬性
由下表說明:
舉例說明:
在上面的表中,「家庭資訊」和「學校資訊」列均不滿足原子性的要求,故不滿足第一正規化,調整如下:
可見,調整後的每一列都是不可再分的,因此滿足第一正規化(1nf);
但是存在乙個問題就是,只滿足第一正規化的表很可能會存在資料冗餘,例如:
例如李白後來又讀了個博士,或者李白從研二公升到研三,然後表裡就會有不止一條李白的資料,這其實並不是也別好的設計。
即在第一正規化的基礎上,消除非主屬性對主碼的部分函式依賴。
第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。
**********====
嚴格來說
主屬性:指主鍵列,即主鍵由一列構成
主鍵定義:能夠唯一標識乙個元組的屬性或屬性集,即可以由多列組成。
在教學中,大多例項都是主鍵由一列構成,所以也可以簡單地說主屬性與主鍵沒有什麼區別。
**********====
舉例說明:
在上圖所示的情況中,同乙個訂單中可能包含不同的產品,因此主鍵必須是「訂單號」和「產品號」聯合組成,
但可以發現,產品數量、產品折扣、產品**與「訂單號」和「產品號」都相關,但是訂單金額和訂單時間僅與「訂單號」相關,與「產品號」無關,
這樣就不滿足第二正規化的要求,調整如下,需分成兩個表:
第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。
舉例說明:
上表中,所有屬性都完全依賴於學號,所以滿足第二正規化,但是「班主任性別」和「班主任年齡」直接依賴的是「班主任姓名」,
而不是主鍵「學號」,所以需做如下調整:
這樣以來,就滿足了第三正規化的要求。
上面說了三大正規化,有些正規化會給表分成兩個表或者多個表,那多表之間又是怎麼聯絡呢?
例如下述表,多個員工可以對應同乙個部門:
表與表之間通過外來鍵連線,在多的一方建立外來鍵,指向一的一方的主鍵。
例如學生表和課程表:
多對多的情況就需要建立第三張表作為中間表,然後表中的字段作為外來鍵,分別指向兩張表的主鍵
例子:
MySQL資料表設計,三大正規化
個人筆記,僅供參考 三大正規化即三個建立資料表的準則,根據自己的實際需求決定是否遵守即可 資料表中的所有欄位都是不可分割的原子值 例如乙個位址資訊,如果全部存在乙個欄位中就不符合第一正規化,需要把國家,省份這些資訊盡可能拆分到不同欄位才滿足。這樣可以方便以後檢索。舉例 create table st...
mysql筆記三 資料表三大設計正規化
1nf 資料表中的所有欄位都是不可分割的原子值 mysql create table student2 id int primary key,name varchar 20 address varchar 30 mysql insert into student2 values 1 張三 中國江蘇省...
資料表三大設計正規化
第一正規化 inf資料表中所有欄位都是不可分割的原子值 create table student2 id int primary key,name varchar 20 address varchar 30 insert into student2 values 1,li 四川省成都市武侯大道100...