1. 程式人生 > >資料庫正規化(NF)

資料庫正規化(NF)

目錄

 

基礎知識

函式依賴

1NF 第一正規化

2NF 第二正規化

3NF 第三正規化

BCNF 鮑依斯-科得正規化

四種範氏之間的關係


基礎知識

實體:現實世界中客觀存在並可以被區別的事物。比如“一個學生”、“一本書”、“一門課”等等。值得強調的是這裡所說的“事物”不僅僅是看得見摸得著的“東西”,它也可以是虛擬的,比如說“老師與學校的關係”。

屬性:教科書上解釋為:“實體所具有的某一特性”,由此可見,屬性一開始是個邏輯概念,比如說,“性別”是“人”的一個屬性。在關係資料庫中,屬性又是個物理概念,屬性可以看作是“表的一列”。

元組:表中的一行就是一個元組。

分量:元組的某個屬性值。在一個關係資料庫中,它是一個操作原子,即關係資料庫在做任何操作的時候,屬性是“不可分的”。否則就不是關係資料庫了。

碼:表中可以唯一確定一個元組的某個屬性(或者屬性組),如果這樣的碼有不止一個,那麼大家都叫候選碼,我們從候選碼中挑一個出來做老大,它就叫主碼。

全碼:如果一個碼包含了所有的屬性,這個碼就是全碼。

主屬性:一個屬性只要在任何一個候選碼中出現過,這個屬性就是主屬性。

非主屬性:與上面相反,沒有在任何候選碼中出現過,這個屬性就是非主屬性。

外碼:一個屬性(或屬性組),它不是碼,但是它別的表的碼,它就是外碼。

 

函式依賴

部分函式依賴:設X,Y是關係R的兩個屬性集合,存在X→Y,若X’是X的真子集,存在X’→Y,則稱Y部分函式依賴於X。

舉個例子:

碼用(學號+課程),為什麼要加課程呢?因為不同課程成績是通過學號查不出來的。

不過用(學號+課程)當作碼是不是有些問題?

(學號+課程)->姓名,但是學號->姓名

(學號+課程)->系名,但是學號->系名

(學號+課程)->系主任,但是學號->系主任

這個就是部分依賴,說實話我看定義一臉懵逼。

要是上面那張表符合第二正規化。需要將表拆分為兩張表。

一張是 學號、課程、分數表

另外一張是 學號、姓名、系名、系主任表


--------------------- 

完全函式依賴:設X,Y是關係R的兩個屬性集合,X’是X的真子集,存在X→Y,但對每一個X’都有X’!→Y,則稱Y完全函式依賴於X。

例子:學生基本資訊表R(學號,班級,姓名)假設不同的班級學號有相同的,班級內學號不能相同,在R關係中,(學號,班級)->(姓名),但是(學號)->(姓名)不成立,(班級)->(姓名)不成立,所以姓名完全函式依賴與(學號,班級);

傳遞函式依賴:設X,Y,Z是關係R中互不相同的屬性集合,存在X→Y(Y !→X),Y→Z,則稱Z傳遞函式依賴於X。

例子:在關係R(學號 ,宿舍, 費用)中,(學號)->(宿舍),宿舍!=學號,(宿舍)->(費用),費用!=宿舍,所以符合傳遞函式的要求;

 

1NF 第一正規化

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

定義:如果一個關係模式R的所有屬性都是不可分的基本資料項,則R屬於1NF。

也可表述為:資料庫表中的欄位都是單一屬性的,不可再分。

例如,下面的資料庫表是符合第一正規化的:

欄位1 欄位2 欄位3 欄位4

而這樣的資料庫表是不符合第一正規化的:

欄位1 欄位2 欄位3 欄位4

欄位3.1 欄位3.2

具體的例子:

比如“地址”屬性應該拆分為“城市”、“區縣”、“具體地址”便於使用。

很顯然,在當前的任何關係資料庫管理系統(DBMS)中,誰也不可能做出不符合第一正規化的資料庫,因為這些DBMS不允許你把資料庫表的一列再分成二列或多列。因此,想在現有的DBMS中設計出不符合第一正規化的資料庫都是不可能的。

 

2NF 第二正規化

若關係模式R∈1NF,並且每一個非主屬性都完全函式依賴於R的碼(多個主屬性欄位的組合),則R∈2NF

也可表述為:資料庫表中不存在非關鍵欄位對任一候選關鍵欄位的部分函式依賴(部分函式依賴指的是存在組合關鍵字中的某些欄位決定非關鍵欄位的情況),也即所有非關鍵欄位都完全依賴於任意一組候選關鍵字。

具體的可以參照上面部分函式依賴的例子

3NF 第三正規化

關係模式R<UF> 中若不存在這樣的碼X、屬性組Y及非主屬性ZZ Í Y, 使得X→YY→Z,成立,則稱R<UF> ∈ 3NF

也可表述為:在第二正規化的基礎上,資料表中如果不存在非關鍵欄位對任一候選關鍵欄位的傳遞函式依賴則符合第三正規化。所謂傳遞函式依賴,指的是如果存在"A → B → C"的決定關係,則C傳遞函式依賴於A。因此,滿足第三正規化的資料庫表應該不存在如下依賴關係:關鍵欄位 → 非關鍵欄位x → 非關鍵欄位y

比如:

BCNF 鮑依斯-科得正規化

設關係模式R<UF>∈1NF,如果對於R的每個函式依賴X→Y,若Y不屬於X,則X必含有候選碼,那麼R∈BCNF

也可表述為:在第三正規化的基礎上,資料庫表中如果不存在任何欄位對任一候選關鍵欄位的傳遞函式依賴則符合第三正規化。

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

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

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

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

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

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

即存在關鍵欄位決定關鍵欄位的情況,所以其不符合BCNF正規化。資料表應修改為:

  倉庫管理:(倉庫ID, 管理員ID)

  倉庫:(倉庫ID, 儲存物品ID, 數量)

 

四種範氏之間的關係

每一個範氏都是進一步約束的關係,如下圖:

四種正規化之間的關係