范式介绍
數(shù)據(jù)庫(kù)的設(shè)計(jì)范式是數(shù)據(jù)庫(kù)設(shè)計(jì)所需要滿足的規(guī)范,滿足這些規(guī)范的數(shù)據(jù)庫(kù)是簡(jiǎn)潔的、結(jié)構(gòu)明晰的,同時(shí),不會(huì)發(fā)生插入( insert )、刪除( delete )和更新( update )操作異常。反之則是亂七八糟,不僅給數(shù)據(jù)庫(kù)的編程人員制造麻煩,而且面目可憎,可能存儲(chǔ)了大量不需要的冗余信息。
第一范式:關(guān)系模式中,每個(gè)屬性不可再分。屬性原子性
第二范式:非主屬性完全依賴于主屬性,即消除非主屬性對(duì)主屬性的部分函數(shù)依賴關(guān)系。
第三范式:非主屬性對(duì)主屬性不存在傳遞函數(shù)依賴關(guān)系。
BNCF范式:在第三范式的基礎(chǔ)上,消除主屬性之間的部分函數(shù)依賴
第四范式:每個(gè)表只有一個(gè)多值依賴集合
范式說(shuō)明
1.1 第一范式( 1NF )無(wú)重復(fù)的列
所謂第一范式( 1NF )是指數(shù)據(jù)庫(kù)表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個(gè)新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對(duì)多關(guān)系。在第一范式( 1NF )中表的每一行只包含一個(gè)實(shí)例的信息。簡(jiǎn)而言之,第一范式就是無(wú)重復(fù)的列。
說(shuō)明:在任何一個(gè)關(guān)系數(shù)據(jù)庫(kù)中,第一范式( 1NF )是對(duì)關(guān)系模式的基本要求,不滿足第一范式( 1NF )的數(shù)據(jù)庫(kù)就不是關(guān)系數(shù)據(jù)庫(kù)。
例如,如下的數(shù)據(jù)庫(kù)表是符合第一范式的:
|
字段 1 |
字段 2 |
字段 3 |
字段 4 |
而這樣的數(shù)據(jù)庫(kù)表是不符合第一范式的:
|
字段 1 |
字段 2 |
字段 3 |
字段 4 |
|
|
字段 3.1 |
字段 3.2 |
|||
數(shù)據(jù)庫(kù)表中的字段都是單一屬性的,不可再分。這個(gè)單一屬性由基本類型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。很顯然,在當(dāng)前的任何關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)( DBMS )中,傻瓜也不可能做出不符合第一范式的數(shù)據(jù)庫(kù),因?yàn)檫@些DBMS 不允許你把數(shù)據(jù)庫(kù)表的一列再分成二列或多列。因此,你想在現(xiàn)有的 DBMS 中設(shè)計(jì)出不符合第一范式的數(shù)據(jù)庫(kù)都是不可能的。
1.2 第二范式( 2NF )屬性完全依賴于主鍵 [ 消除部分子函數(shù)依賴 ]
如果關(guān)系模式 R 為第一范式,并且 R 中每一個(gè)非主屬性完全函數(shù)依賴于 R 的某個(gè)候選鍵, 則稱為第二范式模式。
第二范式( 2NF )是在第一范式( 1NF )的基礎(chǔ)上建立起來(lái)的,即滿足第二范式( 2NF )必須先滿足第一范式(1NF )。第二范式( 2NF )要求數(shù)據(jù)庫(kù)表中的每個(gè)實(shí)例或行必須可以被惟一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的惟一標(biāo)識(shí)。這個(gè)惟一屬性列被稱為主關(guān)鍵字或主鍵、主碼。
例如員工信息表中加上了員工編號(hào)( emp_id )列,因?yàn)槊總€(gè)員工的員工編號(hào)是惟一的,因此每個(gè)員工可以被惟一區(qū)分。
簡(jiǎn)而言之,第二范式( 2NF )就是非主屬性完全依賴于主關(guān)鍵字。
所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性(設(shè)有函數(shù)依賴 W→A ,若存在 XW ,有 X→A 成立,那么稱 W→A 是局部依賴,否則就稱 W→A 是完全函數(shù)依賴)。如果存在,那么這個(gè)屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來(lái)形成一個(gè)新的實(shí)體,新實(shí)體與原實(shí)體之間是一對(duì)多的關(guān)系。
假定選課關(guān)系表為 SelectCourse( 學(xué)號(hào) , 姓名 , 年齡 , 課程名稱 , 成績(jī) , 學(xué)分 ) ,關(guān)鍵字為組合關(guān)鍵字 ( 學(xué)號(hào) , 課程名稱 ) ,因?yàn)榇嬖谌缦聸Q定關(guān)系:
( 學(xué)號(hào) , 課程名稱 ) → ( 姓名 , 年齡 , 成績(jī) , 學(xué)分 )
這個(gè)數(shù)據(jù)庫(kù)表不滿足第二范式,因?yàn)榇嬖谌缦聸Q定關(guān)系:
( 課程名稱 ) → ( 學(xué)分 )
( 學(xué)號(hào) ) → ( 姓名 , 年齡 )
即存在組合關(guān)鍵字中的字段決定非關(guān)鍵字的情況。
由于不符合 2NF ,這個(gè)選課關(guān)系表會(huì)存在如下問(wèn)題:
(1) 數(shù)據(jù)冗余:
同一門(mén)課程由 n 個(gè)學(xué)生選修, " 學(xué)分 " 就重復(fù) n-1 次;同一個(gè)學(xué)生選修了 m 門(mén)課程,姓名和年齡就重復(fù)了 m-1 次。
(2) 更新異常:
若調(diào)整了某門(mén)課程的學(xué)分,數(shù)據(jù)表中所有行的 " 學(xué)分 " 值都要更新,否則會(huì)出現(xiàn)同一門(mén)課程學(xué)分不同的情況。
(3) 插入異常:
假設(shè)要開(kāi)設(shè)一門(mén)新的課程,暫時(shí)還沒(méi)有人選修。這樣,由于還沒(méi)有 " 學(xué)號(hào) " 關(guān)鍵字,課程名稱和學(xué)分也無(wú)法記錄入數(shù)據(jù)庫(kù)。
(4) 刪除異常:
假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫(kù)表中刪除。但是,與此同時(shí),課程名稱和學(xué)分信息也被刪除了。很顯然,這也會(huì)導(dǎo)致插入異常。
把選課關(guān)系表 SelectCourse 改為如下三個(gè)表:
學(xué)生: Student( 學(xué)號(hào) , 姓名 , 年齡 ) ;
課程: Course( 課程名稱 , 學(xué)分 ) ;
選課關(guān)系: SelectCourse( 學(xué)號(hào) , 課程名稱 , 成績(jī) ) 。
這樣的數(shù)據(jù)庫(kù)表是符合第二范式的, 消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。
另外,所有單關(guān)鍵字的數(shù)據(jù)庫(kù)表都符合第二范式,因?yàn)椴豢赡艽嬖诮M合關(guān)鍵字。
1.3 第三范式( 3NF )屬性不依賴于其它非主屬性 [ 消除傳遞依賴 ]
如果關(guān)系模式 R 是第二范式,且每個(gè)非主屬性都不傳遞依賴于 R 的候選鍵,則稱 R 為第三范式模式。
滿足第三范式( 3NF )必須先滿足第二范式( 2NF )。第三范式( 3NF )要求一個(gè)數(shù)據(jù)庫(kù)表中不包含已在其它表中已包含的非主關(guān)鍵字信息。
例如,存在一個(gè)部門(mén)信息表,其中每個(gè)部門(mén)有部門(mén)編號(hào)( dept_id )、部門(mén)名稱、部門(mén)簡(jiǎn)介等信息。那么在的員工信息表中列出部門(mén)編號(hào)后就不能再將部門(mén)名稱、部門(mén)簡(jiǎn)介等與部門(mén)有關(guān)的信息再加入員工信息表中。如果不存在部門(mén)信息表,則根據(jù)第三范式( 3NF )也應(yīng)該構(gòu)建它,否則就會(huì)有大量的數(shù)據(jù)冗余。
第三范式( 3NF ):在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。簡(jiǎn)而言之,第三范式就是屬性不依賴于其它非主屬性。
所謂傳遞函數(shù)依賴,指的是如果存在 "A → B → C" 的決定關(guān)系,則 C 傳遞函數(shù)依賴于 A 。
因此,滿足第三范式的數(shù)據(jù)庫(kù)表應(yīng)該不存在如下依賴關(guān)系:
關(guān)鍵字段 → 非關(guān)鍵字段 x → 非關(guān)鍵字段 y
假定學(xué)生關(guān)系表為 Student( 學(xué)號(hào) , 姓名 , 年齡 , 所在學(xué)院 , 學(xué)院地點(diǎn) , 學(xué)院電話 ) ,關(guān)鍵字為單一關(guān)鍵字 " 學(xué)號(hào) " ,因?yàn)榇嬖谌缦聸Q定關(guān)系:
( 學(xué)號(hào) ) → ( 姓名 , 年齡 , 所在學(xué)院 , 學(xué)院地點(diǎn) , 學(xué)院電話 )
這個(gè)數(shù)據(jù)庫(kù)是符合 2NF 的,但是不符合 3NF ,因?yàn)榇嬖谌缦聸Q定關(guān)系:
( 學(xué)號(hào) ) → ( 所在學(xué)院 ) → ( 學(xué)院地點(diǎn) , 學(xué)院電話 )
即存在非關(guān)鍵字段 " 學(xué)院地點(diǎn) " 、 " 學(xué)院電話 " 對(duì)關(guān)鍵字段 " 學(xué)號(hào) " 的傳遞函數(shù)依賴。
它也會(huì)存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況,讀者可自行分析得知。
把學(xué)生關(guān)系表分為如下兩個(gè)表:
學(xué)生: ( 學(xué)號(hào) , 姓名 , 年齡 , 所在學(xué)院 ) ;
學(xué)院: ( 學(xué)院 , 地點(diǎn) , 電話 ) 。
這樣的數(shù)據(jù)庫(kù)表是符合第三范式的,消除了數(shù)據(jù)冗余、更新異常、插入異常和刪除異常。
1.4 鮑依斯 - 科得范式( BCNF 是 3NF 的改進(jìn)形式)
若關(guān)系模式 R 是第一范式,且每個(gè)屬性都不傳遞依賴于 R 的候選鍵。這種關(guān)系模式就是 BCNF 模式。即在第三范式的基礎(chǔ)上,數(shù)據(jù)庫(kù)表中如果不存在任何字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合鮑依斯 - 科得范式。
假設(shè)倉(cāng)庫(kù)管理關(guān)系表為 StorehouseManage( 倉(cāng)庫(kù) ID, 存儲(chǔ)物品 ID, 管理員 ID, 數(shù)量 ) ,且有一個(gè)管理員只在一個(gè)倉(cāng)庫(kù)工作;一個(gè)倉(cāng)庫(kù)可以存儲(chǔ)多種物品。這個(gè)數(shù)據(jù)庫(kù)表中存在如下決定關(guān)系:
( 倉(cāng)庫(kù) ID, 存儲(chǔ)物品 ID) → ( 管理員 ID, 數(shù)量 )
( 管理員 ID, 存儲(chǔ)物品 ID) → ( 倉(cāng)庫(kù) ID, 數(shù)量 )
所以, ( 倉(cāng)庫(kù) ID, 存儲(chǔ)物品 ID) 和 ( 管理員 ID, 存儲(chǔ)物品 ID) 都是 StorehouseManage 的候選關(guān)鍵字,表中的唯一非關(guān)鍵字段為數(shù)量,它是符合第三范式的。但是,由于存在如下決定關(guān)系:
( 倉(cāng)庫(kù) ID) → ( 管理員 ID)
( 管理員 ID) → ( 倉(cāng)庫(kù) ID)
即存在關(guān)鍵字段決定關(guān)鍵字段的情況,所以其不符合 BCNF 范式。它會(huì)出現(xiàn)如下異常情況:
(1) 刪除異常:
當(dāng)倉(cāng)庫(kù)被清空后,所有 " 存儲(chǔ)物品 ID" 和 " 數(shù)量 " 信息被刪除的同時(shí), " 倉(cāng)庫(kù) ID" 和 " 管理員 ID" 信息也被刪除了。
(2) 插入異常:
當(dāng)倉(cāng)庫(kù)沒(méi)有存儲(chǔ)任何物品時(shí),無(wú)法給倉(cāng)庫(kù)分配管理員。
(3) 更新異常:
如果倉(cāng)庫(kù)換了管理員,則表中所有行的管理員 ID 都要修改。
把倉(cāng)庫(kù)管理關(guān)系表分解為二個(gè)關(guān)系表:
倉(cāng)庫(kù)管理: StorehouseManage( 倉(cāng)庫(kù) ID, 管理員 ID) ;
倉(cāng)庫(kù): Storehouse( 倉(cāng)庫(kù) ID, 存儲(chǔ)物品 ID, 數(shù)量 ) 。
這樣的數(shù)據(jù)庫(kù)表是符合 BCNF 范式的,消除了刪除異常、插入異常和更新異常。
四種范式之間存在如下關(guān)系:
總結(jié)
- 上一篇: Blender 基础 骨架-02 骨架的
- 下一篇: tracert路由跟踪工具使用方法