資料庫三大正規化詳解

2022-10-10 21:21:19 字數 2266 閱讀 6755

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

說明:在任何乙個關聯式資料庫中,第一正規化(1nf)是對關係模式的設計基本要求,一般設計中都必須滿足第一正規化(1nf)。不過有些關係模型中突破了1nf的限制,這種稱為非1nf的關係模型。換句話說,是否必須滿足1nf的最低要求,主要依賴於所使用的關係模型。

我批註一下我個人的理解:所謂所有域都是原子表示每個列不能再拆分。

比如有這樣的一張表

id  | 使用者姓名| ***| age|所在區域...

這樣一張使用者表 很簡單的幾個列名  但如果一開始這樣設計其實是不符合第一正規化的。因為區域這個字段,其實非常籠統  詳細分話其實還可以分 省  市  區  甚至街道。所以這樣的表設計不符合第一正規化

第二正規化:

再看百科的定義:

在1nf的基礎上,非碼屬性必須完全依賴於候選碼(在1nf基礎上消除非主屬性對主碼的部分函式依賴)

第二正規化(2nf)是在第一正規化(1nf)的基礎上建立起來的,即滿足第二正規化(2nf)必須先滿足第一正規化(1nf)。第二正規化(2nf)要求資料庫表中的每個例項或記錄必須可以被唯一地區分。選取乙個能區分每個實體的屬性或屬性組,作為實體的唯一標識。例如在員工表中的身份證號碼即可實現每個一員工的區分,該身份證號碼即為候選鍵,任何乙個候選鍵都可以被選作主鍵。在找不到候選鍵時,可額外增加屬性以實現區分,如果在員工關係中,沒有對其身份證號進行儲存,而姓名可能會在資料庫執行的某個時間重複,無法區分出實體時,設計闢如id等不重複的編號以實現區分,被新增的編號或id選作主鍵。(該主鍵的新增是在er設計時新增,不是建庫時隨意新增)

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

說明:這個第一正規化是在第一正規化的基礎上才成立的 ,這個是前提。第二這個正規化明確了資料庫表中的記錄必須有乙個唯一標識的屬性用來區分記錄。【所以資料不能出現冗餘,重複!!!】

先看下如下表結構設計 :

id|訂單編號|房間號|聯絡人|聯絡人手機|聯絡人**號碼

根據業務  這裡有一種情況 如果乙個人同時預訂了幾個房間  那麼從記錄結果的角度來講 可能存在資料冗餘 即乙個人訂購了多個房間後 顯示多個相同的姓名 手機號  **號碼資訊,所以一般做法是將聯絡人,聯絡人手機,聯絡人號碼單獨獨立出去,主表以乙個聯絡人id作為與另一張外來鍵表關聯。

上述例子中如果根據百科的理解其實是這張表中沒有乙個能區分唯一的屬性,乙個人可以同時訂n個房間,訂單號 房間號 都會不同,但聯絡人相關資訊確是唯一的 所以這裡需要建立乙個候選鍵,至於該鍵相關的其他屬性都可以分離出去做到屬性完全依賴主鍵。

第三正規化:

在2nf基礎上,任何非主屬性不依賴於其它非主屬性(在2nf基礎上消除傳遞依賴)

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

這個正規化強調 字段不能有傳遞性設計。比如 文中講的  

員工id|員工其他資訊。。。|部門id|部門名稱|部門簡介

這張表員工id及員工相關資訊加上部門id其實是乙個整體  如果此時加上部門id之後的資訊 就違反了屬性依賴於其他非主屬性的情況 應該單獨分離。目的還是做到資料盡量不冗餘

實際情況是適當的冗餘是在所難免的。比如訂單型別的表  其實 除了購買商品id外 商品名字一般也會冗餘進去  而且這樣設計也是合理的  一般顧客更關心的是下單那個時候的商品名  也行以後商品名會被更改 但下單那一刻 下次顧客自己的訂單列表  顧客只認下單那的商品名  不然會讓人不可理解與錯誤!

所以並不是一定要完全遵守三大正規化  但請在做表結構設計時 還是先充分考慮它  除非特殊情況特殊對待

資料庫三大正規化詳解

1 第一正規化 1nf 在任何乙個關聯式資料庫中,第一正規化 1nf 是對關係模式的基本要求,不滿足第一正規化 1nf 的資料庫就不是關聯式資料庫。所謂第一正規化 1nf 是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現...

資料庫三大正規化詳解

資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。正規化說明 1.1 第一...

資料庫三大正規化詳解

資料庫面試題 三大正規化詳解 資料庫建模設計中心思想總歸結起來符合三個正規化 簡單理解三個正規化就3句話 1nf 字段不可分 2nf 有主鍵,非主鍵字段依賴主鍵 3nf 非主鍵字段不能相互依賴 解釋 1nf 原子性 字段不可再分,否則就不是關聯式資料庫 2nf 唯一性 乙個表只說明乙個事物 3nf ...