1.基礎(chǔ)概念 實體 :現(xiàn)實世界中客觀存在并可以被區(qū)別的事物。比如“一個學(xué)生”、“一本書”、“一門課”等等。得強調(diào)的是這里所說的“事物”不僅僅是看得見摸得著的“東西”,它也可以是虛擬的,不如說“老師與學(xué)校的關(guān)系”。 屬性 :教科書上解釋為:“實體
1.基礎(chǔ)概念
實體:現(xiàn)實世界中客觀存在并可以被區(qū)別的事物。比如“一個學(xué)生”、“一本書”、“一門課”等等。值得強調(diào)的是這里所說的“事物”不僅僅是看得見摸得著的“東西”,它也可以是虛擬的,不如說“老師與學(xué)校的關(guān)系”。
屬性:教科書上解釋為:“實體所具有的某一特性”,由此可見,屬性一開始是個邏輯概念,比如說,“性別”是“人”的一個屬性。在關(guān)系數(shù)據(jù)庫中,屬性又是個物理概念,屬性可以看作是“表的一列”。
元組:表中的一行就是一個元組。
分量:元組的某個屬性值。在一個關(guān)系數(shù)據(jù)庫中,它是一個操作原子,即關(guān)系數(shù)據(jù)庫在做任何操作的時候,屬性是“不可分的”。否則就不是關(guān)系數(shù)據(jù)庫了。
碼:表中可以唯一確定一個元組的某個屬性(或者屬性組),如果這樣的碼有不止一個,那么都叫候選碼,我們從候選碼中挑一個出來做老大,它就叫主碼。
全碼:如果一個碼包含了所有的屬性,這個碼就是全碼。
候選碼:若關(guān)系中的某一屬性或?qū)傩越M的值能唯一的標(biāo)識一個元組,而其任何真子集都不能再標(biāo)識,則稱該屬性組為(超級碼)候選碼。
主碼:主碼(主鍵,primary key)是被挑選出來,作表的行的唯一標(biāo)識的候選關(guān)碼。一個表只有一個主碼。
外碼:一個屬性(或?qū)傩越M),它不是碼,但是它別的表的碼,它就是外碼。
主屬性:一個屬性只要在任何一個候選碼中出現(xiàn)過,這個屬性就是主屬性。
非主屬性:與上面相反,沒有在任何候選碼中出現(xiàn)過,這個屬性就是非主屬性。
函數(shù)依賴:設(shè)R(U)是一個屬性集U上的關(guān)系模式,X和Y是U的子集。若對于R(U)的任意兩個可能的關(guān)系r1、r2,若r1[x]=r2[x],則r1[y]=r2[y],或者若r1[x]不等于r2[x],則r1[y]不等于r2[y],稱X決定Y,或者Y依賴X。通俗來說,設(shè)X,Y是關(guān)系R的兩個屬性集合,當(dāng)任何時刻R中的任意兩個元組中的X屬性值相同時,則它們的Y屬性值也相同,則稱X函數(shù)決定Y,或Y函數(shù)依賴于X。
完全函數(shù)依賴:設(shè)X,Y是關(guān)系R的兩個屬性集合,X’是X的真子集,存在X→Y,但對每一個X'都有X'!→Y,則稱Y完全函數(shù)依賴于X。
部分函數(shù)依賴:設(shè)X,Y是關(guān)系R的兩個屬性集合,存在X→Y,若X’是X的真子集,存在X’→Y,則稱Y部分函數(shù)依賴于X。
傳遞依賴:在關(guān)系模式R(U)中,設(shè)X,Y,Z是U的不同的屬性集合,如果X→Y成立,且(Y不屬于X,Y→X不成立),Y→Z成立,XYΠZ=,則稱Z傳遞函數(shù)依賴(transitive functional dependency) 于X。式中XY表示是。定義中說明
,是因為如果Y→X,則有X?Y,實際形成X→Z是直接函數(shù)依賴,而非傳遞函數(shù)依賴。例如,在STUDENT關(guān)系模式中,假定班級編號都與系的名稱相關(guān)。例如:計算機系2000年入學(xué)的學(xué)生班級有6個,其班級名稱為:JS001,JS002,JS003,JS004,JS005,JS006。這樣,可以由學(xué)生的學(xué)號確定學(xué)生所在的班級,由班級名稱就可以確定學(xué)生所在系,形成傳遞函數(shù)依賴:
SNO→SCLASS→SDEP
2.范式介紹
1)第一范式(1NF)
所謂第一范式(1NF)是指在關(guān)系模型中,對域添加的一個規(guī)范要求,所有的域都應(yīng)該是原子性的,即數(shù)據(jù)庫表的每一列都是不可分割的原子數(shù)據(jù)項,而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一范式就是無重復(fù)的域。
2)第二范式(2NF)屬性
在1NF的基礎(chǔ)上,非碼屬性必須完全依賴于主鍵[在1NF基礎(chǔ)上消除非主屬性對主碼的部分函數(shù)依賴]。第二范式(2NF)要求實體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個新的實體,新實體與原實體之間是一對多的關(guān)系。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標(biāo)識。簡而言之,第二范式就是在第一范式的基礎(chǔ)上屬性完全依賴于主鍵。
3)第三范式(3NF)屬性
在1NF基礎(chǔ)上,任何非主屬性不依賴于其它非主屬性[在2NF基礎(chǔ)上消除傳遞依賴]。第三范式(3NF)是第二范式(2NF)的一個子集,即滿足第三范式(3NF)必須滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個關(guān)系中不包含已在其它關(guān)系已包含的非主關(guān)鍵字信息。例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關(guān)的信息再加入員工信息表中。如果不存在部門信息表,則根據(jù)第三范式(3NF)也應(yīng)該構(gòu)建它,否則就會有大量的數(shù)據(jù)冗余。簡而言之,第三范式就是屬性不依賴于其它非主屬性,也就是在滿足2NF的基礎(chǔ)上,任何非主屬性不得傳遞依賴于主屬性。
4)巴德斯科范式(BCNF)屬性
如果關(guān)系模式R(U,F(xiàn))的所有屬性(包括主屬性和非主屬性)都不傳遞依賴于R的任何候選關(guān)鍵字,那么稱關(guān)系R是屬于BCNF的。或是關(guān)系模式R中,每個決定因素都包含關(guān)鍵字(而不是被關(guān)鍵字所包含)。巴德斯科范式(BCNF)是第三范式(3NF)的一個子集,即滿足巴德斯科范式(BCNF)必須滿足第三范式(3NF)。通常情況下,只是對第二范式與第三范式中設(shè)計規(guī)范要求更強,因而被認(rèn)為是修正第三范式,它事實上是對第三范式的修正,使數(shù)據(jù)庫冗余度更小。
3.實例分析
下面以一個學(xué)校的學(xué)生系統(tǒng)為例分析說明,這幾個范式的應(yīng)用。
1)第一范式實例分析:
首先第一范式(1NF):數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。單一屬性由基本類型構(gòu)成,包括整型、實數(shù)、字符型、邏輯型、日期型等。確定一下要設(shè)計的內(nèi)容包括:學(xué)號、學(xué)生姓名、年齡、性別、課程、課程學(xué)分、系別、學(xué)科成績,系辦地址、系辦電話等信息。我們對于這些信息,說關(guān)心的問題有如下幾個方面。
2)第二范式實例分析:
首先把所有這些信息放到一個表中(學(xué)號,學(xué)生姓名、年齡、性別、課程、課程學(xué)分、系別、學(xué)科成績,系辦地址、系辦電話)下面存在如下的依賴關(guān)系。
(學(xué)號, 課程名稱) → (姓名, 年齡, 成績, 學(xué)分)
問題分析:
(學(xué)號,課程名稱)作為主碼,但姓名、年齡完全依賴于學(xué)號,學(xué)分完全依賴于課程名稱,所以不滿足第二范式。可能導(dǎo)致以下的問題:
數(shù)據(jù)冗余:同一門課程由n個學(xué)生選修,"學(xué)分"就重復(fù)n-1次;同一個學(xué)生選修了m門課程,姓名和年齡就重復(fù)了m-1次。
更新異常:
1)若調(diào)整了某門課程的學(xué)分,數(shù)據(jù)表中所有行的"學(xué)分"值都要更新,否則會出現(xiàn)同一門課程學(xué)分不同的情況。
2)假設(shè)要開設(shè)一門新的課程,暫時還沒有人選修。這樣,由于還沒有"學(xué)號"關(guān)鍵字,課程名稱和學(xué)分也無法記錄入數(shù)據(jù)庫。
刪除異常 :假設(shè)一批學(xué)生已經(jīng)完成課程的選修,這些選修記錄就應(yīng)該從數(shù)據(jù)庫表中刪除。但是,與此同時,課程名稱和學(xué)分信息也被刪除了。很顯然,這也會導(dǎo)致插入異常
解決方案
把選課關(guān)系表SelectCourse改為如下三個表:
學(xué)生:Student(學(xué)號,姓名,年齡,性別,系別,系辦地址、系辦電話);
課程:Course(課程名稱,學(xué)分);
選課關(guān)系:SelectCourse(學(xué)號,課程名稱,成績)。
3)第三范式實例分析
接著看上面的學(xué)生表Student(學(xué)號,姓名,年齡,性別,系別,系辦地址、系辦電話),關(guān)鍵字為單一關(guān)鍵字"學(xué)號",因為存在如下依賴關(guān)系:
(學(xué)號)→ (姓名,年齡,性別,系別,系辦地址、系辦電話)
問題分析:
但是還存在下面的決定關(guān)系
(學(xué)號) → (所在系辦)→(系辦地點,系辦電話)
即存在非關(guān)鍵字段"系辦地點"、"系辦電話"對關(guān)鍵字段"學(xué)號"的傳遞函數(shù)依賴。
它也會存在數(shù)據(jù)冗余、更新異常、插入異常和刪除異常的情況。
解決方案:
根據(jù)第三范式把學(xué)生關(guān)系表分為如下兩個表就可以滿足第三范式了。
學(xué)生:(學(xué)號,姓名,年齡,性別,系別);
系別:(系別,系辦地址、系辦電話)。
4)第四范式(BNCF范式)實例分析:
例:配件管理關(guān)系模式 wpe(wid,pid,eid,qnt)分別表倉庫號,配件號,職工號,數(shù)量。有以下條件:、
a.一個倉庫有多個職工。
b.一個職工僅在一個倉庫工作。
c.每個倉庫里一種型號的配件由專人負(fù)責(zé),但一個人可以管理幾種配件。
d.同一種型號的配件可以分放在幾個倉庫中。
問題分析:
1. pid不能確定qnt,由組合屬性(wid,pid)來決定,存在函數(shù)依賴(wid,pid)-> qnt。
2. 每個倉庫里的一種配件由專人負(fù)責(zé),而一個人可以管理幾種配件,所以有(wid,pid)-> eid。
3. 一個職工僅在一個倉庫工作,有eid -> wid。
4. 每個倉庫里的一種配件由專人負(fù)責(zé),而一個職工僅在一個倉庫工作,有(eid,pid)-> qnt。
找一下候選關(guān)鍵字。因為(wid,pid)-> qnt,(wid,pid)-> eid,因此(wid,pid)可以決定整個元組,是一個候選關(guān)鍵字。根據(jù)eid -> wid,(eid,pid)-> qnt,故(eid,pid)也能決定整個元組,為另一個候選關(guān)鍵字。屬性eid,eid,pid
均為主屬性;只有一個非主屬性qnt,它對任何一個候選關(guān)鍵字都是完全函數(shù)依賴的,并且是直接依賴,所以該關(guān)系模式是3NF。
分析一下主屬性。因為eid -> wid,主屬性eid是wid的決定因素,但是它本身不是關(guān)鍵字,只是組合關(guān)鍵字的一部分。這就造成主屬性wid對另外一個候選關(guān)鍵字(eid,pid)的部分依賴,因為(eid,pid)-> eid但反過來不成立,而pid -> wid,故(eid,pid)->eid, eid-> wid 也是傳遞依賴。
雖然沒有非主屬性對候選關(guān)鍵字的傳遞依賴,但存在主屬性對候選關(guān)鍵字的傳遞依賴,同樣也會帶來麻煩。如一個新職工分配到倉庫工作,但暫時處于實習(xí)階段,沒有獨立負(fù)責(zé)對某些配件的管理任務(wù)。由于缺少關(guān)鍵字的一部分pid而無法插入到該關(guān)系中去。又如某個人改成不管配件了去負(fù)責(zé)安全,則在刪除配件的同時該職工也會被刪除。
解決辦法:分成管理ep(eid,pid,qnt),關(guān)鍵字是(eid,pid)和工作ew(eid,wid)其關(guān)鍵字是eid。
缺點:分解后函數(shù)依賴的保持性較差。如此例中,由于分解,函數(shù)依賴(wid,pid)-> eid 丟失了,因而對原來的語義有所破壞。沒有體現(xiàn)出每個倉庫里一種部件由專人負(fù)責(zé)。有可能出現(xiàn)一部件由兩個人或兩個以上的人來同時管理。因此,分解之后的關(guān)系模式降低了部分完整性約束。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com