一正規化 二正規化 三正規化區別

2021-08-07 21:51:10 字數 3959 閱讀 9469

正規化:英文名稱是 normal form,它是英國人 e.f.codd(關聯式資料庫的老祖宗)在上個世紀70年代提出關聯式資料庫模型後總結出來的,正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。目前有跡可尋的共有8種正規化,依次是:1nf,2nf,3nf,bcnf,4nf,5nf,dknf,6nf。通常所用到的只是前三個正規化,即:第一正規化(1nf),第二正規化(2nf),第三正規化(3nf)。下面就簡單介紹下這三個正規化。 

◆ 第一正規化(1nf):強調的是列的原子性,即列不能夠再分成其他幾列。 

考慮這樣乙個表:【聯絡人】(姓名,性別,**) 

如果在實際場景中,乙個聯絡人有家庭**和公司**,那麼這種表結構設計就沒有達到 1nf。要符合 1nf 我們只需把列(**)拆分,即:【聯絡人】(姓名,性別,家庭**,公司**)。1nf 很好辨別,但是 2nf 和 3nf 就容易搞混淆。 

◆ 第二正規化(2nf):首先是 1nf,另外包含兩部分內容,一是表必須有乙個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。 

考慮乙個訂單明細表:【orderdetail】(orderid,productid,unitprice,discount,quantity,productname)。 

因為我們知道在乙個訂單中可以訂購多種產品,所以單單乙個 orderid 是不足以成為主鍵的,主鍵應該是(orderid,productid)。顯而易見 discount(折扣),quantity(數量)完全依賴(取決)於主鍵(oderid,productid),而 unitprice,productname 只依賴於 productid。所以 orderdetail 表不符合 2nf。不符合 2nf 的設計容易產生冗餘資料。 

可以把【orderdetail】表拆分為【orderdetail】(orderid,productid,discount,quantity)和【product】(productid,unitprice,productname)來消除原訂單表中unitprice,productname多次重複的情況。 

◆ 第三正規化(3nf):首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 a 依賴於非主鍵列 b,非主鍵列 b 依賴於主鍵的情況。 

考慮乙個訂單表【order】(orderid,orderdate,customerid,customername,customeraddr,customercity)主鍵是(orderid)。 

其中 orderdate,customerid,customername,customeraddr,customercity 等非主鍵列都完全依賴於主鍵(orderid),所以符合 2nf。不過問題是 customername,customeraddr,customercity 直接依賴的是 customerid(非主鍵列),而不是直接依賴於主鍵,它是通過傳遞才依賴於主鍵,所以不符合 3nf。 

通過拆分【order】為【order】(orderid,orderdate,customerid)和【customer】(customerid,customername,customeraddr,customercity)從而達到 3nf。 

第二正規化(2nf)和第三正規化(3nf)的概念很容易混淆,區分它們的關鍵點在於,2nf:非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分;3nf:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。

1.1 第一正規化(1nf)無重複的列

所謂第一正規化(1nf)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義乙個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1nf)中表的每一行只包含乙個例項的資訊。簡而言之,第一正規化就是無重複的列。

說明:在任何乙個關聯式資料庫中,第一正規化(1nf)是對關係模式的基本要求,不滿足第一正規化(1nf)的資料庫就不是關聯式資料庫。 

1.2 第二正規化(2nf)屬性完全依賴於主鍵[消除部分子函式依賴]

第二正規化(2nf)是在第一正規化(1nf)的基礎上建立起來的,即滿足第二正規化(2nf)必須先滿足第一正規化(1nf)。第二正規化(2nf)要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要為表加上乙個列,以儲存各個例項的惟一標識。例如員工資訊表中加上了員工編號(emp_id)列,因為每個員工的員工編號是惟一的,因此每個員工可以被惟一區分。這個惟一屬性列被稱為主關鍵字或主鍵、主碼。 

第二正規化(2nf)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成乙個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上乙個列,以儲存各個例項的惟一標識。簡而言之,第二正規化就是屬性完全依賴於主鍵。 

1.3 第三正規化(3nf)屬性不依賴於其它非主屬性[消除傳遞依賴]

滿足第三正規化(3nf)必須先滿足第二正規化(2nf)。簡而言之,第三正規化(3nf)要求乙個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。例如,存在乙個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在的員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3nf)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三正規化就是屬性不依賴於其它非主屬性。 

下面以乙個學校的學生系統為例分析說明,這幾個正規化的應用。首先第一正規化(1nf):資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。在當前的任何關聯式資料庫管理系統(dbms)中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些dbms不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的dbms中設計出不符合第一正規化的資料庫都是不可能的。 

首先我們確定一下要設計的內容包括那些。學號、學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**等資訊。為了簡單我們暫時只考慮這些字段資訊。我們對於這些資訊,說關心的問題有如下幾個方面。 

2.1 第二正規化(2nf)例項分析

首先我們考慮,把所有這些資訊放到乙個表中(學號,學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**)下面存在如下的依賴關係。 

(學號)→ (姓名, 年齡,性別,系別,系辦位址、系辦**) 

(課程名稱) → (學分) 

(學號,課程)→ (學科成績)

2.1.1 問題分析

因此不滿足第二正規化的要求,會產生如下問題 

資料冗餘: 同一門課程由n個學生選修,"學分"就重複n-1次;同乙個學生選修了m門課程,姓名和年齡就重複了m-1次。 

更新異常: 

1)若調整了某門課程的學分,資料表中所有行的"學分"值都要更新,否則會出現同一門課程學分不同的情況。 

2)假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,課程名稱和學分也無法記錄入資料庫。 

刪除異常 : 假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。

2.1.2 解決方案

把選課關係表selectcourse改為如下三個表:

2.2 第三正規化(3nf)例項分析

接著看上面的學生表student(學號,姓名, 年齡,性別,系別,系辦位址、系辦**),關鍵字為單一關鍵字"學號",因為存在如下決定關係: 

(學號)→ (姓名, 年齡,性別,系別,系辦位址、系辦**) 

但是還存在下面的決定關係 

(學號) → (所在學院)→(學院地點, 學院**) 

即存在非關鍵字段"學院地點"、"學院**"對關鍵字段"學號"的傳遞函式依賴。 

它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況。 (資料的更新,刪除異常這裡就不分析了,可以參照2.1.1進行分析)

根據第三正規化把學生關係表分為如下兩個表就可以滿足第三正規化了: 

學生:(學號, 姓名, 年齡, 性別,系別);  總結

上面的資料庫表就是符合i,ii,iii正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。 

一正規化 二正規化 三正規化

1 第一正規化 如果乙個關係模式r的所有屬性都是不可分的基本資料項,則r 1nf。簡單的說,第一正規化就是每乙個屬性都不可再分。不符合第一正規化則不能稱為關聯式資料庫。第一正規化 1nf 要求資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值。若某一列有多個值,可以將該列單獨拆分成乙個實...

資料庫正規化 一正規化 二正規化 三正規化 BC正規化

一正規化 關係模式r所有的屬性都是不可分割的,不能為組合屬性 多值屬性。一正規化是資料庫設計裡的必要條件。二正規化 非主碼的屬性集依賴於主碼屬性集,不依賴於主碼屬性集的子集 bcnf boyce bodd normal form bc正規化 在二正規化的基礎上,消除更多的冗餘。第三正規化 在bc正規...

什麼是正規化?第一正規化 第二正規化 第三正規化的區別

總結 正規化的含義 符合某種級別的關係模式的集合。表示乙個關係內部的各屬性之間聯絡的合理化程度。可以理解為 資料表的表結構所符合的某種設計標準的級別。第一正規化 是對關係模式的基本要求。不滿足第一正規化的關係,不能稱為關係型資料庫。符合第一正規化的關係,每個屬性都不可以再分割。但是如果僅僅滿足第一正...