正規化,英文:normal form,簡稱nf。它的由英國關係型資料庫鼻祖 e.f.codd在提出關係型資料庫模型後總結出來的一種理論,正規化也是關係型資料庫的理論基礎,也是我們在設計資料庫時需要遵守的守則。簡言之就是,資料庫設計對資料的儲存效能,還有開發人員對資料的操作都有莫大的關係。所以建立科學的,規範的的資料庫是需要滿足一些規範的來優化資料資料儲存方式。在關係型資料庫中這些規範就可以稱為正規化。 目前在市面上,有跡可循的正規化總共有8種,但是我們目前常用的是前三種,所以也簡稱為三正規化,那麼下面我們就來介紹這三大正規化。我們可以結合表的例項來進行理解,現在假設有一張職工(staff)表,建表語句如下:
[sql] 純文字檢視 複製**?01
0203
0405
0607
0809
1011
1213
create
table
`staff` (
`id`
int
(11)
not
null
auto_increment comment
'職員編號'
,
`
name
`
varchar
(10)
default
null
comment
'職員名字'
,
`gender`
int
(1)
default
null
comment
'職員性別,1:男,0:女'
,
`mobile`
varchar
(30)
default
null
comment
'職員**'
,
`postcode`
varchar
(10)
default
null
comment
'郵編'
,
`province`
varchar
(10)
default
null
comment
'省'
,
`city`
varchar
(10)
default
null
comment
'市'
,
`county`
varchar
(10)
default
null
comment
'區、縣'
,
`deptno`
varchar
(10)
default
null
comment
'職員所屬部門'
,
`deptname`
varchar
(10)
default
null
comment
'職員所屬部門名稱'
,
primary
key
(`id`)
) engine=innodb auto_increment=4
default
charset=utf8;
下面我們就根據三大正規化來分析這張表的存在的問題,及如何更改讓它更加的符合三大正規化。
1.第一正規化:列的原子性
當關係模式r的所有屬性都不能在分解為更基本的資料單位時,稱r是滿足第一正規化的,簡記為1nf。滿足第一正規化是關係模式規範化的最低要求,否則,將有很多基本操作在這樣的關係模式中實現不了。其實說得明白點,就是資料庫表的每乙個字段(列)都是單一屬性、不可再分的。
例如上面的staff表中有乙個字段(mobile)是用來儲存職員**的,但是一般職員都有辦公**和家庭**兩個號碼,那麼就會出現在這個字段插入的資料會出現多個**號碼,違背了第一正規化
所以只要將mobile欄位拆分成辦公**(businessphone)和家庭**(homephone)就可以區分開,就能滿足第一正規化。
第二正規化:確保表中的每列都和主鍵相關,消除部分依賴
在滿足第一正規化的基礎之上,第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在乙個資料庫表中,只能有乙個主鍵,而且主鍵只能為乙個字段,不能是聯合主鍵。
以上面那張職員表(staff)為例,在這張表中乙個候選鍵是,而deptname依賴於deptno,同樣 name 依賴於 id,因此不符合第二正規化的。為了滿足第二正規化的條件,可以將這個表拆分成staff、dept、staff_dept、staff_mobile四個表。如下:
其實第二正規化就是將有資料冗餘的資料表通過表和表之間的外來鍵關聯起來,從而減小了資料庫的冗餘。
第三正規化:消除傳遞依賴,非主屬性的依賴
第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。舉個例子,在設計乙個訂單資料表的時候,可以將客戶編號作為乙個外來鍵和訂單表建立相應的關係。而不可以在訂單表中新增關於客戶其它資訊(比如姓名、所屬公司等)的字段。再以上面的staff表為例,province、city、county依賴於postcode(郵編),而postcode依賴於id,換句話說,province、city、county傳遞依賴於id,違反了第三正規化規則。為了滿足第三正規化的條件,我們可以再將staff表拆分成staff和address兩個表,如下:
總結:在設計資料庫的時候我們要最大程度遵循三正規化,當然三正規化最大的問題在於查詢的時候關聯很多表,會導致查詢效率很低。所以有些時候基於效能考慮,可以違反三正規化,適當的做冗餘,達到提高查詢效率的目的。不過違反正規化是適度的,必須為這種做法提供充分的理由。
資料庫三大正規化理解
1nf 字段不可分 2nf 有主鍵,非主鍵字段依賴主鍵 3nf 非主鍵字段不能相互依賴 不符合第一正規化的例子 關聯式資料庫中create不出這樣的表 表 欄位1,欄位2 欄位2.1,欄位2.2 欄位3 存在的問題 因為設計不出這樣的表,所以沒有問題 不符合第二正規化的例子 假定選課關係表為sele...
資料庫的三大正規化理解
1.第一正規化 要求所有字段值不可再分,保持每個欄位的原子性 2.第二正規化 表中的每個欄位都要和主鍵相關,而不能之和主鍵 聯合主鍵 的一部分相關,即不存在部分依賴 一張表中只儲存一種資料。比如要設計乙個學生課程資訊表 學號,課程號,姓名,學分 該錶包含了兩類資訊 學生資訊與課程。由於非主鍵必須依賴...
資料庫 三大設計正規化(概念 三大正規化的理解)
1 概念 設計正規化 正規化,資料庫設計正規化,資料庫的設計正規化 是符合某一種級別的關係模式的集合。構造資料庫必須遵循一定的規則。在關聯式資料庫中,這種規則就是正規化。關聯式資料庫中的關係必須滿足一定的要求,即滿足不同的正規化。目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf ...