關於資料庫幾種正規化的理解

2021-05-21 11:50:51 字數 1797 閱讀 2033

正規化分類:1nf,2nf,3nf,bcnf,4nf

1,第一正規化

資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。

它只是一些屬性的堆積,但是每個是不能再分的。

2,第二正規化

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

3,第三正規化

用定義來描述就是:

關係模式r中若不存在這樣的碼x,屬性組y及非主屬性z(z≮y)使得x->y,y->z成立,y!->x,則稱r∈3nf.

這樣理解確實有點費解,那麼我們用乙個實際的例子來說明即可.

假定學生關係表為sn(學號, 姓名, 年齡, 所在學院, 學院地點, 學院**),關鍵字為單一關鍵字"學號",因為存在如下決定關係:

(學號) → (姓名, 年齡, 所在學院, 學院地點, 學院**)

這個資料庫是符合2nf的,但是不符合3nf,因為存在如下決定關係:

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

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

它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況,讀者可自行分析得知。

把學生關係表分為如下兩個表:

學生:(學號, 姓名, 年齡, 所在學院);

學院:(學院, 地點, **)。

這樣的資料庫表是符合第三正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。

4,bc正規化

bcnf(boyce codd normal form)是由boyce與codd提出的,比3nf又進了一步,通常認為bcnf是修正的第三正規化,有時也成為擴充的第三正規化。

定義:所謂第三正規化,定義是關係模式r中若不存在這樣的碼x,屬性組y及非主屬性z,使得x—>y,y—>z成立,(不存在y—>x),則稱r為3nf.

例項理解:

假設倉庫管理關係表為storehousemanage(倉庫id, 儲存物品id, 管理員id, 數量),且有乙個管理員只在乙個倉庫工作;乙個倉庫可以儲存多種物品。這個資料庫表中存在如下決定關係: 

(倉庫id, 儲存物品id) →(管理員id, 數量) 

(管理員id, 儲存物品id) → (倉庫id, 數量) 

所以,(倉庫id, 儲存物品id)和(管理員id, 儲存物品id)都是storehousemanage的候選關鍵字,表中的唯一非關鍵字段為數量,它是符合第三正規化的。但是,由於存在如下決定關係: 

(倉庫id) → (管理員id) 

(管理員id) → (倉庫id) 

即存在關鍵字段決定關鍵字段的情況,所以其不符合bcnf正規化。它會出現如下異常情況: 

(1) 刪除異常: 

當倉庫被清空後,所有"儲存物品id"和"數量"資訊被刪除的同時,"倉庫id"和"管理員id"資訊也被刪除了。 

(2) 插入異常: 

當倉庫沒有儲存任何物品時,無法給倉庫分配管理員。 

(3) 更新異常: 

如果倉庫換了管理員,則表中所有行的管理員id都要修改。 

把倉庫管理關係表分解為二個關係表: 

倉庫管理:storehousemanage(倉庫id, 管理員id); 

倉庫:storehouse(倉庫id, 儲存物品id, 數量)。 

這樣的資料庫表是符合bcnf正規化的,消除了刪除異常、插入異常和更新異常。 

5,第四正規化

待續。

資料庫正規化理解

當前我們使用的主流資料庫是關係型資料庫,所以我是記錄在關係型資料庫中對正規化的一些理解和看法。資料庫庫正規化分為六種 其實還有有乙個bcnf 分別為從第一正規化到第六正規化。高階一層是建立在所有低層的基礎上的,如第2正規化是建立在第一正規化的基礎上的,依次類推。下面分別舉例講解各種正規化 第一正規化...

資料庫正規化的理解

就是滿足了單一屬性不能再分割,正常情況下,你在資料庫裡建立的表肯定是滿足這個正規化的,要想不滿足這個正規化,可以在excel中嘗試合併單元格,拆分單元格體會下,就明白了。2nf 必須不存在非關鍵字段對組合的關鍵字段中的某些的依賴,比如某個表有 個關鍵字,但是它的非關鍵屬性 依賴第乙個關鍵字,非關鍵屬...

資料庫正規化的理解

資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型 實數 字元型 邏輯型 日期型等。在當前的任何關聯式資料庫管理系統 dbms 中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些dbms不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的dbms中設計出不符合...