數(shù)據(jù)庫原理與應(yīng)用(MySQL版) 課件 何玉潔 第7-13章 SQL擴展編程-國產(chǎn)數(shù)據(jù)庫_第1頁
數(shù)據(jù)庫原理與應(yīng)用(MySQL版) 課件 何玉潔 第7-13章 SQL擴展編程-國產(chǎn)數(shù)據(jù)庫_第2頁
數(shù)據(jù)庫原理與應(yīng)用(MySQL版) 課件 何玉潔 第7-13章 SQL擴展編程-國產(chǎn)數(shù)據(jù)庫_第3頁
數(shù)據(jù)庫原理與應(yīng)用(MySQL版) 課件 何玉潔 第7-13章 SQL擴展編程-國產(chǎn)數(shù)據(jù)庫_第4頁
數(shù)據(jù)庫原理與應(yīng)用(MySQL版) 課件 何玉潔 第7-13章 SQL擴展編程-國產(chǎn)數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩528頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第7章SQL擴展編程數(shù)據(jù)庫原理與應(yīng)用1本章內(nèi)容7.1SQL編程基礎(chǔ)7.2存儲過程7.3函數(shù)7.4觸發(fā)器27.1SQL編程基礎(chǔ)7.1.1變量7.1.2游標7.1.3運算符7.1.4分支結(jié)構(gòu)7.1.5循環(huán)結(jié)構(gòu)37.1.1變量MySQL的變量分為兩種:會話變量無需定義可直接使用,在使用時在變量名前加“@”符號即可。普通變量必須在存儲過程、函數(shù)或觸發(fā)器中使用,需要先聲明(定義)后使用,聲明時也可以賦值。4會話變量會話變量的賦值方式有三種:方式1:使用SET語句給會話變量賦值。

SET@變量名=表達式;例7-1定義會話變量num,并賦值為5。SET@num=5;5會話變量方式2:使用SELECT語句給會話變量賦值。

SELECT@變量名:=表達式;例7-2查詢books表中quanlity字段的最大值并賦值給會話變量max_qty。SELECT@max_qty:=max(quantity)FROMbooks;67.1.1變量方式3:使用INTO子句,直接將查詢結(jié)果賦給會話變量:

SELECT表達式INTO@變量名;例7-3查詢圖書的總數(shù)量,并將結(jié)果賦值給sum_qty。SELECTsum(quantity)INTO@sum_qtyFROMbooks;7查看會話變量的值可通過SELECT語句查看會話變量的值。例如:SELECT@sum_qty;8普通變量定義普通變量的方法:DECLARE變量名

類型[default默認值];給普通變量賦值可以使用SET語句,方法為:

SET變量名=值;97.1.2游標游標(cursor)是SELECT語句檢索出來的結(jié)果集。游標可以在存儲過程、函數(shù)、觸發(fā)器中使用。定義好游標后,用戶可根據(jù)需要滾動或瀏覽游標中數(shù)據(jù)。使用游標的四個步驟:聲明游標打開游標遍歷游標關(guān)閉游標101.聲明游標聲明游標就是指定游標所包含的結(jié)果,這個結(jié)果是由執(zhí)行SELECT語句產(chǎn)生的。聲明游標語法如下:DECLARE游標名稱CURSORFOR查詢語句;112.打開游標聲明游標后,MySQL并不執(zhí)行聲明游標的SELECT語句,只有通過執(zhí)行打開游標的操作,才會執(zhí)行游標對應(yīng)的SELECT語句,產(chǎn)生游標的內(nèi)容。打開游標的語法:OPEN游標名稱;123.遍歷游標遍歷游標是使用循環(huán)方法遍歷游標結(jié)果集中的每行數(shù)據(jù),在遍歷的過程中可對游標數(shù)據(jù)進行處理。遍歷游標的語法如下:

FETCH游標名稱INTO變量列表;取出游標指針所指的當前行數(shù)據(jù),并將每個數(shù)據(jù)保存到相應(yīng)變量中,然后將游標指針下移一行的數(shù)據(jù)一般和循環(huán)語句結(jié)合使用。13說明如果使用FETCH時當前行無數(shù)據(jù),會引發(fā)MySQL內(nèi)部的NOTFOUND異常??梢酝ㄟ^下述語句進行異常處理:DECLARECONTINUEHANDLERFORNOTFOUNDSET變量=TRUE;當遇到NOTFOUND錯誤時,將變量設(shè)為TRUE。144.關(guān)閉游標游標使用完之后一定要關(guān)閉,以釋放游標所占資源。關(guān)閉游標的語句:CLOSE游標名稱;157.1.3運算符介紹常用的算術(shù)運算符關(guān)系運算符邏輯運算符161.算術(shù)運算符主要用于數(shù)學運算,主要有:+、-、*、/、%(取余數(shù))和MOD(取模)。說明:加法運算中,如果參與運算的數(shù)值或表達式有一個為NULL,則運算結(jié)果為NULL。乘法運算中,參與運算的兩方數(shù)值都為整型時,結(jié)果為整型;若有一個數(shù)值為浮點型,則結(jié)果為浮點型。除法運算中,一個數(shù)除以整數(shù)后,不管是否能除盡,結(jié)果都為一個浮點數(shù);當除數(shù)是0時,結(jié)果為NULL。172.關(guān)系運算符關(guān)系運算符有:>、>=、<、<=、=、<>、!=運算符的結(jié)果為真/假,在MySQL中用1/0表示。注意,=、<>、!=運算符不能用于NULL的比較,如果有一個值是NULL,則比較結(jié)果為NULL。183.邏輯運算符邏輯運算符:and、or、not運算結(jié)果與Java、C語言中的邏輯與、邏輯或、邏輯非的運算規(guī)則相同,運算符的結(jié)果為真/假,在MySQL中用1/0表示。197.1.4分支結(jié)構(gòu)包括單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)。單分支結(jié)構(gòu)

IF條件表達式THEN

語句塊ENDIF;當條件表達式為“真”時,執(zhí)行語句塊。20雙分支結(jié)構(gòu)IF條件表達式THEN

語句塊1[ELSE

語句塊2]ENDIF;當條件表達式為“真”時,執(zhí)行語句塊1,否則執(zhí)行語句塊2。21多分支結(jié)構(gòu)多分支結(jié)構(gòu)有兩種實現(xiàn)方法用IF語句實現(xiàn)用CASE表達式實現(xiàn)。22多分支結(jié)構(gòu)(續(xù)1)用IF語句實現(xiàn):IF條件表達式1THEN

語句塊1[ELSEIF條件表達式2THEN

語句塊2][…n][ELSE

語句塊n+1]ENDIF;23多分支結(jié)構(gòu)(續(xù)2)用CASE表達式實現(xiàn):CASE表達式WHEN常量值1THEN語句塊1;WHEN常量值2THEN語句塊2;……WHEN常量值nTHEN語句塊n;[ELSE語句塊n+1;]ENDCASE;247.1.5循環(huán)結(jié)構(gòu)MySQL的循環(huán)結(jié)構(gòu)有三種:WHILEREPEATLOOP25WHILE循環(huán)WHILE循環(huán)條件DO循環(huán)體語句塊ENDWHILE當“循環(huán)條件”為真時,執(zhí)行循環(huán)體語句塊,當循環(huán)條件為假時,結(jié)束循環(huán)。26REPEAT循環(huán)REPEAT循環(huán)體語句塊UNTIL結(jié)束循環(huán)的條件

ENDREPEAT;當“結(jié)束循環(huán)的條件”為真時,結(jié)束循環(huán),否則繼續(xù)執(zhí)行循環(huán)體。27LOOP循環(huán)循環(huán)名:LOOPIF判斷條件THENLEAVE循環(huán)名;ENDIF;其它循環(huán)體語句ENDLOOP;28程序從LOOP至ENDLOOP循環(huán),在“LOOP”單詞前定義循環(huán)名,在循環(huán)體中,當符合判斷條件時,通過“LEAVE循環(huán)名”語句結(jié)束循環(huán)。本章內(nèi)容7.1SQL編程基礎(chǔ)7.2存儲過程7.3函數(shù)7.4觸發(fā)器297.2存儲過程存儲過程(StoredProcedure)是數(shù)據(jù)庫中一組為了完成特定功能的SQL語句塊,它將常用或復雜的工作預先用SQL語句編寫腳本并指定名稱存儲在數(shù)據(jù)庫服務(wù)器中,存儲過程中可以包含控制語句,可以完成復雜的數(shù)據(jù)操作功能,用戶通過調(diào)用存儲過程來執(zhí)行它。存儲過程是數(shù)據(jù)庫中的一個重要對象,利用存儲過程可以提高數(shù)據(jù)的操作效率。30定義存儲過程DELIMITER$$CREATEPROCEDURE存儲過程名([[in|out|inout]參數(shù)1數(shù)據(jù)類型][,[in|out|inout]參數(shù)2數(shù)據(jù)類型,...])BEGIN [DECLARE變量名

類型[DEFAULT值];]

存儲過程的語句塊;END$$--DELIMITER語句的作用是重新定義MySQL語句的分隔符。31定義存儲過程(續(xù))存儲過程中的參數(shù):in:輸入?yún)?shù)(默認情況下為in參數(shù)),該參數(shù)的值在調(diào)用時指定。out:輸出參數(shù),存儲過程運行過程中可以對該類參數(shù)賦值,起到將計算結(jié)果返回給調(diào)用程序的作用。inout:既是輸入?yún)?shù),又是輸出參數(shù),該參數(shù)的值可在調(diào)用時指定,又可以將計算結(jié)果返回給調(diào)用程序。32調(diào)用存儲過程調(diào)用存儲過程使用CALL語句:CALL存儲過程名(實參列表)[;]33定義存儲過程示例例7-4定義一個無參數(shù)存儲過程,該存儲過程查詢?nèi)繄D書信息。DELIMITER$$CREATEPROCEDUREshowAllBooks()BEGINSELECTISBN,bname,category,press,pub_dateFROMbooks;END$$34定義存儲過程示例例7-5定義有一個輸入?yún)?shù)的存儲過程。該存儲過程查詢指定出版社出版的圖書信息,出版社為輸入?yún)?shù)。DELIMITER$$CREATEPROCEDUREshowPressBooks(INpressnamevarchar(40))BEGINSELECTISBN,bname,category,press,pub_dateFROMbooksWHEREpress=pressname;END$$35pressname為輸入?yún)?shù),作為SELECT語句的查詢條件。當調(diào)用有輸入?yún)?shù)的存儲過程時,必須為輸入?yún)?shù)指定一個確定值。調(diào)用存儲過程示例調(diào)用showPressBooks存儲過程,查詢“機械工業(yè)出版社”出版的圖書信息,結(jié)果如圖所示。CALLshowPressBooks('機械工業(yè)出版社');36定義存儲過程示例例7-6定義有多個輸入?yún)?shù)的存儲過程。查詢指定學院和性別的學生信息,學院和性別為輸入?yún)?shù)。DELIMITER$$CREATEPROCEDUREshowStudents(INsexchar(2),INcollegenamevarchar(30))BEGINSELECT*FROMstudentsWHEREgender=sexandcollege=collegename;END$$37調(diào)用存儲過程示例執(zhí)行帶多個參數(shù)的存儲過程時,實參的順序必須與定義存儲過程時定義的參數(shù)順序一致、類型兼容。調(diào)用本例存儲過程:查詢計算機學院的男生信息。CALLshowStudents('男','計算機學院');38定義存儲過程示例例7-7定義查詢指定出版社的圖書種類數(shù)的存儲過程,圖書種類數(shù)用輸出參數(shù)返回。DELIMITER$$CREATEPROCEDUREgetBookCount(inpressnameVARCHAR(20),outbookcountint)BEGINSELECTsum(quantity)INTObookcountFROMbooksWHEREpress=pressname;END$$39bookcount為out類型參數(shù),可以在存儲過程中被賦值。調(diào)用存儲過程示例調(diào)用本例存儲過程:查詢“機械工業(yè)出版社”出版的圖書總數(shù)量,并用SELECT語句查看存儲過程的返回結(jié)果。CALLgetBookCount('機械工業(yè)出版社',@bcount);SELECT@bcount;@bcount作為實參,對應(yīng)存儲過程中的bookcount形參,用于保存存儲過程的返回結(jié)果。40定義使用IF語句的存儲過程示例例7-8建立滿足要求的存儲過程,該存儲過程首先根據(jù)給定的圖書ISBN號判斷該圖書的庫存數(shù)量,若庫存數(shù)量為0,則提示“庫存不足”;否則根據(jù)給定的ISBN號和學號在圖書借閱表中插入相應(yīng)數(shù)據(jù),并給出提示“借閱成功”。41例7-8(續(xù))DELIMITER$$CREATEPROCEDUREborrowBook(inisbncodevarchar(30),instuidchar(9))BEGINDECLAREbookcountint;--保存圖書數(shù)量DECLAREresultvarchar(50);--保存操作結(jié)果SELECTquantityINTObookcountFROMbooksWHEREisbn=isbncode;IFbookcount=0THENSETresult='庫存不足';ELSEINSERTINTOborrow(isbn,sid,borrow_time)VALUES(isbncode,stuid,now());UPDATEbooksSETquantity=quantity-1WHEREisbn=isbncode;SETresult='借閱成功';ENDIF;SELECTresult;END$$42假設(shè)ISBN號為“9787111650812”的圖書的庫存數(shù)量為1。第一次調(diào)用上述存儲過程,返回的結(jié)果如圖所示。CALLborrowBook('9787111650812','202101001');。用同樣的參數(shù)再次調(diào)用該存儲過程,返回的結(jié)果如圖7-7所示。CALLborrowBook('9787111650812','202101001');定義使用循環(huán)語句的存儲過程例7-9設(shè)已有數(shù)據(jù)表bookcountyear,該表有兩個字段pubyear和quantity,分別用于存儲圖書出版年份和對應(yīng)的圖書數(shù)量?,F(xiàn)要統(tǒng)計2016-2022年間每年出版的圖書數(shù)量,并將結(jié)果存儲到數(shù)據(jù)表bookcountyear中。43例7-9(續(xù))DELIMITER$$CREATEPROCEDUREgetBookCountYear()BEGINDECLAREpubyearint;SETpubyear=2016;WHILEpubyear<=2022doSELECTIFNULL(sum(quantity),0)INTO@bookcountFROMbooksWHEREyear(pub_date)=pubyear;INSERTINTObookcountyear(pubyear,quantity)VALUES(pubyear,@bookcount);SETpubyear=pubyear+1;ENDWHILE;END$$44調(diào)用該存儲過程:DELETEFROMbookcountyear;CALLgetBookCountYear();查詢bookcountyear表中數(shù)據(jù),結(jié)果如圖/。所示。SELECT*FROMbookcountyear;定義使用游標的存儲過程例7-10在books表中增加一列,列名:state,類型為文本字符串,默認值為“正?!?。使用游標完成對圖書的如下處理,將2017年1月1日之前出版的圖書庫存量設(shè)為0,并將state列設(shè)為“已下架”,將2017年1月1日至2019年12月31日之間出版的圖書state列設(shè)為“即將下架”,2019年12月31日之后出版的圖書,其state列值用默認值。45例7-10(續(xù))DELIMITER$$CREATEPROCEDUREprocessbooks()BEGINDECLAREbookidCHAR(13);DECLAREpubdatevarchar(50);/*創(chuàng)建游標結(jié)束標志變量*/DECLAREcursor_ENDintDEFAULTFALSE;/*聲明游標*/DECLAREbkscursorForSELECTisbn,pub_dateFROMbooks;/*設(shè)置游標結(jié)束時cursor_END的值為true,用來判斷游標是否結(jié)束*/DECLARECONTINUEHANDLERFORNOTFOUNDSETcursor_END=TRUE;/*打開游標*/OPENbks;46例7-10(續(xù))/*通過循環(huán)遍歷游標*/a:LOOPFETCHbksINTObookid,pubdate;/*當觸發(fā)NOTFOUND異常,退出循環(huán)*/IFcursor_ENDTHENLEAVEa;ENDIF;IFpubdate<'2017-01-01'THEN UPDATEbooksSETquantity=0,state='已下架'WHEREisbn=bookid;ELSEIFpubdateBETWEEN'2017-01-01'and'2019-12-31'THEN UPDATEbooksSETstate='即將下架'WHEREISBN=bookid;EndIF;ENDLOOP;/*關(guān)閉游標*/CLOSEbks;END$$477.2.3維護存儲過程維護存儲過程的操作包括:刪除存儲過程查看存儲過程信息查看定義存儲過程的代碼487.2.3維護存儲過程

刪除存儲過程:DROPPROCEDURE存儲過程名;

查看系統(tǒng)中已有存儲過程的信息:SHOWCREATEPROCEDURE存儲過程名;查看某數(shù)據(jù)庫中特定存儲過程的信息:SHOWPROCEDURESTATUSWHEREdb='數(shù)據(jù)名'ANDNAME='過程名';49本章內(nèi)容7.1SQL編程基礎(chǔ)7.2存儲過程7.3函數(shù)7.4觸發(fā)器507.3.1函數(shù)的概念與作用函數(shù)也是數(shù)據(jù)庫中的一組完成特定功能的SQL語句集合。函數(shù)的定義和調(diào)用與存儲過程類似,但也有一些重要區(qū)別。自定義函數(shù)不能有輸出參數(shù)。自定義函數(shù)的函數(shù)體中必須包含一條RETURN語句。自定義函數(shù)是在SELECT語句中調(diào)用執(zhí)行的。517.3.2定義與調(diào)用函數(shù)定義函數(shù)使用CREATEFUNCTION語句CREATEFUNCTION函數(shù)名([參數(shù)1數(shù)據(jù)類型][,參數(shù)2數(shù)據(jù)類型]...])RETURNS<類型><函數(shù)體>52定義函數(shù)示例例7-11定義函數(shù):計算兩個數(shù)的乘積。DELIMITER$$CREATEFUNCTIONsumprice(priceDECIMAL(6,2),quantityint)RETURNSDECIMAL(6,2)BEGINDECLAREallpriceDECIMAL(6,2);SETallprice=price*quantity;RETURNallprice;END$$53price和quantity為輸入?yún)?shù),乘積的結(jié)果賦給allprice,函數(shù)返回值為allprice。調(diào)用函數(shù)示例調(diào)用例7-11函數(shù),查看圖書的ISBN號、書名、價格、數(shù)量以及該圖書的總價(總價=價格*數(shù)量):SELECTisbn,bname,price,quantity,sumprice(price,quantity)ASsumpriceFROMbooks;547.3.3維護函數(shù)刪除函數(shù)查看函數(shù)信息查看定義函數(shù)的代碼等。55刪除函數(shù)、查看函數(shù)信息刪除函數(shù)的語句的語法為:DROPFUNCTION函數(shù)名;查看系統(tǒng)中已有函數(shù)的信息:SHOWFUNCTIONSTATUS;56查看特定函數(shù)信息、函數(shù)定義代碼查看某數(shù)據(jù)庫中特定函數(shù)的信息SHOWFUNCTIONSTATUSWHEREDB='數(shù)據(jù)庫名'ANDNAME='函數(shù)名';查看指定函數(shù)的定義代碼SHOWCREATEFUNCTION函數(shù)名;57本章內(nèi)容7.1SQL編程基礎(chǔ)7.2存儲過程7.3函數(shù)7.4觸發(fā)器587.4.1觸發(fā)器的概念與作用觸發(fā)器和存儲過程一樣,也是存儲數(shù)據(jù)庫中的一段完成特定功能的SQL語句集合。主要區(qū)別是觸發(fā)器是由對數(shù)據(jù)進行的更改操作觸發(fā)自動執(zhí)行。這些操作包括INSERT、UPDATE、DELETE等。當對數(shù)據(jù)表中的數(shù)據(jù)執(zhí)行插入、更新和刪除操作,需要自動執(zhí)行一些數(shù)據(jù)庫邏輯時,可以使用觸發(fā)器來實現(xiàn)。觸發(fā)器通常用于保證業(yè)務(wù)規(guī)則和復雜數(shù)據(jù)完整性。597.4.2定義觸發(fā)器定義觸發(fā)器時,需要指定觸發(fā)器名字、觸發(fā)器所作用的表、引發(fā)觸發(fā)器執(zhí)行的操作以及觸發(fā)器要完成的功能。CREATETRIGGER觸發(fā)器名{BEFORE|AFTER}{INSERT|UPDATE|DELETE}ON表名FOREACHROW觸發(fā)器體;60說明表名

:觸發(fā)器作用的對象。BEFORE|AFTER:觸發(fā)的時機。BEFORE:定義前觸發(fā)型觸發(fā)器。表示在引發(fā)觸發(fā)器執(zhí)行的操作執(zhí)行之前先執(zhí)行觸發(fā)器,再執(zhí)行引發(fā)觸發(fā)器執(zhí)行的操作。AFTER:定義后觸發(fā)型觸發(fā)器。表示在引發(fā)觸發(fā)器執(zhí)行的操作執(zhí)行之后,再執(zhí)行觸發(fā)器。INSERT|UPDATE|DELETE:指定引發(fā)觸發(fā)器執(zhí)行的操作。FOREACHROW:指定觸發(fā)器類型是行級觸發(fā)器。61定義觸發(fā)器示例例7-12創(chuàng)建BEFORE型觸發(fā)器:觸發(fā)器名:BEFORE_borrow;作用:在學生借書之前,判斷圖書當前庫存數(shù)量是否大于零,是則可借出圖書,并將圖書數(shù)量減1。如果庫存數(shù)量為0,則提示庫存不足。62例7-12(續(xù))DELIMITER//CREATETRIGGERBEFORE_borrowBEFOREINSERTONborrowFOREACHROWBEGINSELECTquantityINTO@bookcountFROMbooksWHEREisbn=NEW.isbn;IF@bookcount=0THENSIGNALSQLSTATE'02000'SETMESSAGE_TEXT='警告:圖書庫存不足';ELSEUPDATEbooksSETquantity=quantity-1WHEREisbn=NEW.isbn;EndIF;END//63定義觸發(fā)器示例例7-13創(chuàng)建名為after_student_UPDATE的AFTER型觸發(fā)器,每當更新students表數(shù)據(jù)后,向students_log數(shù)據(jù)表中插入日志信息,記錄更新前的值,并記錄更新時間。假設(shè)students_log表已建好,其結(jié)構(gòu)為:students_log(sid,sname,gender,college,email,logtime)64例7-13(續(xù))DELIMITER//CREATETRIGGERafter_student_UPDATEAFTERUPDATEONstudentsFOREACHROWBEGININSERTINTOstudents_log(sid,sname,gender,college,email,logtime)VALUES(OLD.sid,OLD.sname,OLD.gender,OLD.college,OLD.email,now());END//657.4.3維護觸發(fā)器查看當前數(shù)據(jù)庫中所有觸發(fā)器的定義:

SHOWTRIGGERS;查看當前數(shù)據(jù)庫中某個觸發(fā)器的定義:

SHOWCREATETRIGGER觸發(fā)器名;刪除觸發(fā)器

DROPTRIGGERIFEXISTS觸發(fā)器名;66本章結(jié)束67第8章

關(guān)系規(guī)范化理論

數(shù)據(jù)庫原理與應(yīng)用68本章內(nèi)容8.1關(guān)系規(guī)范化的意義8.2函數(shù)依賴8.3函數(shù)依賴的推理規(guī)則8.4范式8.5關(guān)系模式的分解準則698.1關(guān)系規(guī)范化的意義關(guān)系模式的好與壞直接影響到數(shù)據(jù)庫中數(shù)據(jù)的操作效率。下面通過一個示例來分析“不好”的關(guān)系模式會帶來的問題。70示例假設(shè)有描述學生借閱書籍的關(guān)系模式:S-B-B(SID,Email,ISBN,bname,category,price,borrow_time,return_time)其中各屬性分別為:學號、郵箱、國際標準書號、圖書名、圖書分類、價格、借書時間和還書時間。該關(guān)系模式的主鍵為

(SID,ISBN,borrow_time)。71數(shù)據(jù)示例SIDEmailISBNbnamecategorypriceborrow_timereturn_time202101002liuchen@9787302505945零基礎(chǔ)入門學習C語言TP792021-10-159:45:002021-10-2913:42:00202101004zxhong@9787302505945零基礎(chǔ)入門學習C語言TP792021-10-118:45:002021-11-214:00:00202102001zhanghai@9787304103415我的最后一本發(fā)音書H482021-9-2110:05:002021-10-1214:00:00202102003zshshan@9787304103415我的最后一本發(fā)音書H482021-9-2411:15:002021-10-1414:00:00202101002liuchen@9787111641247深入理解Java虛擬機TP1292022-6-159:45:00NULL202101002liuchen@9787100158602牛津高階英漢雙解詞典H1692022-6-159:45:00NULL72存在問題數(shù)據(jù)冗余問題數(shù)據(jù)更新問題數(shù)據(jù)插入問題數(shù)據(jù)刪除問題73本章內(nèi)容8.1關(guān)系規(guī)范化的意義8.2函數(shù)依賴8.3函數(shù)依賴的推理規(guī)則8.4范式8.5關(guān)系模式的分解準則748.2函數(shù)依賴函數(shù)依賴非平凡的函數(shù)依賴平凡的函數(shù)依賴完全函數(shù)依賴、部分函數(shù)依賴傳遞函數(shù)依賴候選鍵、主屬性、非主屬性751、函數(shù)依賴函數(shù)Y=f(X)表示的是X和Y的對應(yīng)關(guān)系,即給定一個X值,都會有一個Y值和它對應(yīng)。也可以說,X函數(shù)決定Y,或Y函數(shù)依賴于X。76函數(shù)依賴(續(xù))函數(shù)依賴注重的是語義上的關(guān)系,如:

書名=f(ISBN)“ISBN”是自變量X,“書名”是因變量或函數(shù)值Y。一般把X函數(shù)決定Y,或Y函數(shù)依賴于X表示為:

X→Y。77示例學生關(guān)系模式Students(SID,Sname,gender,college,Email)有以下函數(shù)依賴關(guān)系:SID→Sname,

SID→gender,

SID→college,

SID→Email78函數(shù)依賴定義設(shè)有關(guān)系模式R(A1,A2,…,An),X和Y均為{A1,A2,…,An}的子集,r是R的任一具體關(guān)系,t1、t2是r中的任意兩個元組;如果由t1[X]=t2[X]可以推導出t1[Y]=t2[Y],則稱X函數(shù)決定Y,或Y函數(shù)依賴于X,記為X→Y。792、非平凡的函數(shù)依賴如果X→Y,但Y不包含于X,則稱

X→Y是非平凡的函數(shù)依賴。Students(SID,Sname,gender,college,Email)的函數(shù)依賴:SID→Sname,SID→gender, SID→college,SID→Email均為非平凡的函數(shù)依賴。無特別聲明,我們討論的都是非平凡的函數(shù)依賴。803、平凡的函數(shù)依賴如果X→Y,但Y包含于X,則稱X→Y是平凡的函數(shù)依賴。例如:(SID,Sname)→Sname814、完全函數(shù)依賴、部分函數(shù)依賴如果X→Y,并且對于X的一個任意真子集X'都有X'?Y,則稱Y完全函數(shù)依賴于X,記作:如果X'→Y成立,則稱Y部分函數(shù)依賴于X,記作:825、傳遞函數(shù)依賴如果X→Y(非平凡函數(shù)依賴,并且Y?X)、Y→Z,則稱Z傳遞函數(shù)依賴于X。83例1設(shè)有關(guān)系模式S(Sno,Sname,Sdept,Dept_master),主鍵為Sno,則有如下函數(shù)依賴:由:可推出:846、候選鍵、主屬性、非主屬性設(shè)K為關(guān)系模式R的一個屬性或?qū)傩越M,若滿足:則稱K為關(guān)系模式R的候選鍵(也稱為候選碼)包含在候選鍵中的屬性為主屬性,不包含在任何候選鍵中的屬性稱為非主屬性。85例8-2有關(guān)系模式:圖書(書號,書名,出版日期,作者號,作者名,作者聯(lián)系電話,圖書價格),語義如下:每部圖書有唯一的書號;每個作者有唯一的作者號;每部圖書有唯一的作者,每個作者可以編寫多部圖書;86例8-2(續(xù))每部圖書有唯一的出版日期和價格;每個作者有唯一的聯(lián)系電話;書名可能有重復;作者名可能有重復。判斷該關(guān)系模式是否存在傳遞函數(shù)依賴。87例8-2(續(xù))由:書號→作者號

作者號→作者名

作者號→作者聯(lián)系電話

可推出:可見該關(guān)系模式存在傳遞函數(shù)依賴。88本章內(nèi)容8.1關(guān)系規(guī)范化的意義8.2函數(shù)依賴8.3函數(shù)依賴的推理規(guī)則8.4范式8.5關(guān)系模式的分解準則898.3函數(shù)依賴的推理規(guī)則8.3.1Armstrong公理8.3.2閉包及候選鍵求解方法8.3.3極小函數(shù)依賴集908.3.1Armstrong公理函數(shù)依賴的推理規(guī)則最早出現(xiàn)在1974年W.W.Armstrong論文中,因此稱這些規(guī)則為Armstrong公理。自反律增廣律傳遞律合并規(guī)則分解規(guī)則偽傳遞規(guī)則復合規(guī)則911、自反律設(shè)有關(guān)系模式R(U,F),U為關(guān)系模式R上的屬性全集,F(xiàn)是R上的函數(shù)依賴集,X,Y,Z,W均是U的子集,(用XY表示X∪Y)若Y?X?U,則X→Y在R上成立,即一組屬性函數(shù)決定它的所有子集。例,對Students(SID,Sname,gender,college,Email),有:(SID,Sname)→Sname和(SID,Sname)→SID例,對Students(SID,Sname,gender,college,Email),有:(SID,Sname)→Sname和(SID,Sname)→SID922、增廣律若X→Y在R上成立

,且Z?U,則XZ→YZ在R上也成立。例:Students(SID,Sname,gender,college,Email)因:SID→Sname

成立,則:(SID,Email)→(Sname,Email)933、傳遞律若X→Y和Y→Z在R上成立,則X→Z在R上也成立。對:S(SID,Sname,Sdept,Dept_master)由:SID→Sdept,Sdept→Dept_master可以推出:SID→Dept_master944、合并規(guī)則若X→Y和X→Z在R上成立,則X→YZ在R上也成立。對:Students(SID,Sname,gender,college,Email)有:SID→Sname,SID→Email則有:SID→(Sname,Email)成立955、分解規(guī)則若X→Y和Z?Y在R上成立,則X→Z在R上也成立。對:Students(SID,Sname,gender,college,Email)

有:SID→(Sname,gender,college,Email)則有:SID→Email

成立966、偽傳遞規(guī)則若X→Y和YW→Z在R上成立,則XW→Z在R上也成立。borrow(ISBD,SID,borrow_time,return_time)的函數(shù)依賴:(ISBD,SID,borrow_time)→return_time

增加屬性IDentity,borrow(ISBD,SID,borrow_time,return_time,IDentity)有IDentity→SID,(ISBD,SID,borrow_time)→return_time則有:(ISBD,IDentity,borrow_time)→return_time977、復合規(guī)則若X→Y和W→Z在R上成立,則XW→YZ在R上也成立。對S(SID,Sname,Sdept,Dept_master)有函數(shù)依賴:

SID→Sname和Sdept→Dept_master則有:(SID,Sdept)→(Sname,Dept_master)988.3.2閉包及候選鍵求解方法對于一個關(guān)系模式R(U,F(xiàn)),引入了函數(shù)依賴集閉包概念,推導全部的函數(shù)依賴。991.函數(shù)依賴集的閉包定義:在關(guān)系模式R(U,F)中,U是R的屬性全集,F(xiàn)是R上的一組函數(shù)依賴。設(shè)X、Y是U的子集,對于關(guān)系模式R的任何一個關(guān)系r,若函數(shù)依賴X→Y都成立(即r中任意兩元組t,s,若t[X]=s[X],則t[Y]=s[Y])那么稱F邏輯蘊涵X→Y,或稱函數(shù)依賴X→Y可由F導出。所有被F邏輯蘊涵的函數(shù)依賴的全集稱為F的閉包,記作F+。100例8-3設(shè)有關(guān)系模式R(A,B,C,G,H,I)及其函數(shù)依賴集F={A→B,A→C,CG→H,CG→I,B→H}判斷A→H、CG→HI和AG→I是否屬于F+。101例8-3(續(xù))解:根據(jù)Armstrong公理系統(tǒng):(1)由:A→B和B→H,根據(jù)傳遞性,可推出A→H。(2)由:CG→H和CG→I,根據(jù)合并規(guī)則,可推出CG→HI。(3)由:A→C和CG→I,根據(jù)偽傳遞規(guī)則,可推出AG→I。因此,A→H、CG→HI和AG→I均屬于F+。102例8-4已知關(guān)系模式R(A,B,C,D,E,G)及其函數(shù)依賴集F:F={AB→C,C→A,BC→D,ACD→B,D→EG,BE→C,CG→BD,CE→AG}判斷BD→AC是否屬于F+。103例8-4(續(xù))解:由D→EG,可推出:D→E,BD→BE…①又由BE→C,C→A,

可推出:BE→A,BE→AC…②由①、②,可推出BD→AC,因此BD→AC被F所蘊涵,即BD→AC屬于F+。104計算F+的過程步驟1:

初始,F(xiàn)+=F。步驟2:

對F+中的每個函數(shù)依賴f,在f上應(yīng)用自反性和增廣性,將結(jié)果加入到F+中;對F+中的一對函數(shù)依賴f1和f2,如果f1和f2可以使用傳遞律結(jié)合起來,則將結(jié)果加入到F+中;對F+中的一對函數(shù)依賴f1和f2,如果能用合并規(guī)則、偽傳遞規(guī)則和復合規(guī)則,則將結(jié)果加入到F+中;對F+中的每個函數(shù)依賴f,如果能應(yīng)用分解規(guī)則,將結(jié)果加入到F+中;105計算F+的過程(續(xù))步驟3:重復步驟2,直到F+不再增大為止。例:有關(guān)系模式R<U,F>,U=(X,Y,Z),F(xiàn)={X→Y,Y→Z},應(yīng)用Armstrong公理系統(tǒng)計算得出:F+={X→X,X→Y,X→Z,X→XY,X→YZ,X→XZ,Y→Y,Y→Z,Y→YZ,Z→Z,XY→X,XY→Y,XY→Z,XY→XY,XY→YZ,XY→XZ,XY→XYZ,XZ→X,XZ→Y,XZ→Z,XZ→XY,......}106函數(shù)依賴集的閉包(續(xù))由于F+中包含大量的冗余信息,因此計算F+的全部函數(shù)依賴是不必要的??捎脤傩约]包來判斷X→Y是否為F所蘊涵。1072、屬性集閉包判定函數(shù)依賴X→Y是否能由F導出的問題,可轉(zhuǎn)化為求X+并判定Y是否是X+子集的問題。即求函數(shù)依賴集閉包問題可轉(zhuǎn)化為求屬性集問題。定義:設(shè)有關(guān)系模式R(U,F(xiàn)),U為R的屬性集,F(xiàn)是R上的函數(shù)依賴集,X是U的一個子集(X?U)。用函數(shù)依賴推理規(guī)則可從F推出的函數(shù)依賴X→A中所有A的集合,稱為屬性集X關(guān)于F的閉包,記為X+(或X+F)。1082、屬性集閉包(續(xù))對關(guān)系模式R(U,F),求屬性集X相對于函數(shù)依賴集F的閉包X+的算法如下:步驟1:初始,X+=X。步驟2:如果F中有某個函數(shù)依賴Y→Z滿足Y?X+。

則X+=X+∪Z。步驟3:重復步驟2,直到X+

不再增大為止。109例8-5(續(xù))步驟2:①對X+

中的X,∵有X→Y,∴X+=X+∪Y=XY②對X+

中的Y,∵有Y→Z,∴X+=X+∪Z=XYZ在函數(shù)依賴集F中,Z不出現(xiàn)在任何函數(shù)依賴的左部,因此X+將不會再擴大,所以最終X+=XYZ。110例8-5設(shè)有關(guān)系模式R(U,F(xiàn)),其中屬性集U={X,Y,Z,W},函數(shù)依賴集F={X→Y,Y→Z,W→Y},計算X+、(XW)+解:(1)計算X+步驟1:初始:X+=X。111例8-5(續(xù))(2)計算(XW)+步驟1:初始:(XW)+=XW。步驟2:①對(XW)+

中的X,∵有X→Y,∴(XW)+=XW+∪Y=XWY②對(XW)+

中的Y,∵有Y→Z,∴(XW)+=XW+∪Z=XWYZ112例8-5(續(xù))③對(XW)+

中的W,有W→Y,但Y已在(XW)+中,因此(XW)+

保持不變。④對(XW)+中的Z,由于Z不出現(xiàn)在任何函數(shù)依賴的左部,因此(XW)+

保持不變。最終(XW)+=XWYZ。113例8-6

設(shè)有關(guān)系模式R(U,F(xiàn)),其中U={A,B,C,D,E},F(xiàn)={(A,B)→C,B→D,C→E,(C,E)→B,(A,C)→B},計算(AB)+。解:步驟1:初始:(AB)+=AB。114例8-6(續(xù))步驟2:①對(AB)+

中的A、B,∵有(A,B)→C,∴(AB)+=(AB)+∪C=ABC②對(AB)+

中的B,∵有B→D,∴(AB)+=(AB)+∪D=ABCD③對(AB)+

中的C,∵有C→E,∴(AB)+=(AB)+∪E=ABCDE115例8-6(續(xù))至此,(AB)+

已包含了R中的全部屬性,因此(AB)+

計算完畢。最終(AB)+=ABCDE。116例8-7已知關(guān)系模式R=(A,B,C,D,E,G),其函數(shù)依賴集F為:F={AB→C,C→A,BC→D,ACD→B,D→EG,BE→C,CG→BD,CE→AG}求(BD)+,并判斷BD→AC是否屬于F+。117例8-7(續(xù))解:(BD)+={B,D,E,G,C,A}由于{A,C}?(BD)+

,因此BD→AC可由F導出,即BD→AC屬于F+。118例8-8已知關(guān)系模式R(A,B,C,E,H,P,G),其函數(shù)依賴集F為:F={AC→PE,PG→A,B→CE,A→P,GA→B,GC→A,PAB→G,AE→GB,ABCP→H}證明BG→HE屬于F+。119例8-8(續(xù))證:因為(BG)+={A,B,C,E,H,P,G},而{H,E}?(BG)+所以BG→HE可由F導出,即BG→HE屬于F+。120屬性集閉包(續(xù))求屬性集閉包的另一個用途是:如果屬性集X的閉包X+包含了R中的全部屬性,則X為R的一個候選鍵。1213、候選鍵的求解方法對于給定的關(guān)系模式R(A1,A2,…,An)和函數(shù)依賴集F,現(xiàn)將R的屬性分為如下四類:(1)L類:僅出現(xiàn)在函數(shù)依賴左部的屬性。(2)R類:僅出現(xiàn)在函數(shù)依賴右部的屬性。(3)N類:在函數(shù)依賴的左部和右部均不出現(xiàn)的屬性。(4)LR類:在函數(shù)依賴的左部和右部均出現(xiàn)的屬性。1223、候選鍵的求解方法(續(xù))對R中的屬性X,可有以下結(jié)論:(1)若X是L類屬性,則X一定包含在關(guān)系模式R的任何一個候選鍵中;若X+包含了R的全部屬性,則X為關(guān)系模式R的唯一候選鍵。(2)若X是R類屬性,則X不包含在關(guān)系模式R的任何一個候選鍵中。(3)若X是N類屬性,則X一定包含在關(guān)系模式R的任何一個候選鍵中。(4)若X是LR類屬性,則X可能包含在關(guān)系模式R的某個候選鍵中。123例8-9設(shè)有關(guān)系模式R(U,F(xiàn)),其中U={A,B,C,D},F(xiàn)={D→B,B→D,AD→B,AC→D},求R的所有候選鍵。由A、C兩個屬性是L類屬性,因此A、C兩個屬性必定在R的任何一個候選鍵中;又由(AC)+=ABCD,即(AC)+包含了R的全部屬性,因此,AC是R的唯一候選鍵。124例8-10設(shè)有關(guān)系模式R(U,F(xiàn)),其中U={A,B,C,D,E,G},F(xiàn)={A→D,E→D,D→B,BC→D,DC→A},求R的所有候選鍵。125例8-10(續(xù))由:C、E兩個屬性是L類屬性,因此C、E兩個屬性必定在R的任何一個候選鍵中。由:G是N類屬性,故屬性G也必定在R的任何一個候選鍵中。又由:(CEG)+=ABCDEG,即(CEG)+包含了R的全部屬性,因此,CEG是R的唯一候選鍵。126例8-11設(shè)有關(guān)系模式R(U,F(xiàn)),其中U={A,B,C,D,E,G},F(xiàn)={AB→E,AC→G,AD→B,B→C,C→D},求R的所有候選鍵。127例8-11(續(xù))由:A是L類屬性,故A必定在R的任何一個候選鍵中。由:E、G是兩個R類屬性,故E、G一定不包含在R的任何候選鍵中。由:A+=A≠ABCDEG,故A不能單獨作為候選鍵。128例8-11(續(xù))由:B、C、D三個屬性均是LR類屬性則:這三個屬性中必有部分或全部在某個候選鍵中。將B、C、D依次與A結(jié)合,分別求閉包:

(AB)+=ABCDEG,因此AB為R的一個候選鍵;

(AC)+=ABCDEG,因此AC為R的一個候選鍵;

(AD)+=ABCDEG,因此AD為R的一個候選鍵。綜上所述,關(guān)系模式R共有三個候選鍵:AB、AC和AD。129例8-12設(shè)有關(guān)系模式R(U,F(xiàn)),其中U={A,B,C,D,E},F(xiàn)={A→BC,CD→E,B→D,E→A},求R的所有候選鍵。130例8-12(續(xù))由:關(guān)系模式R中沒有L類、R類和N類屬性,所有的屬性都是LR類屬性。因此,先從A、B、C、D、E屬性中依次取出一個屬性,分別求它們的閉包: A+=ABCDE B+=BD C+=C D+=D E+=ABCDE131例8-12(續(xù))

由:A+和E+都包含了R的全部屬性,得:A和E分別是R的一個候選鍵。

接下來,從R中任意取出兩個屬性,分別求他們的閉包。由于A、E已是R的候選鍵了,因此只需在C、D、E中進行選取即可。132例8-12(續(xù))(BC)+=ABCDE(BD)+=BD(CD)+=ABCDE因此,BC和CD分別是R的一個候選鍵。至此,關(guān)系模式R的全部候選鍵為:A、E、BC和CD。1338.3.3極小函數(shù)依賴集對于一個關(guān)系模式R(U,F(xiàn)),利用推理規(guī)則推導出其全部的函數(shù)依賴集是非常龐大的,但是每一個函數(shù)依賴集均等價于一個極小函數(shù)依賴集。1348.3.3極小函數(shù)依賴集(續(xù))對關(guān)系模式R(U,F(xiàn)),如果函數(shù)依賴集F滿足下列條件,則稱F為R的一個極小函數(shù)依賴集(或稱為最小依賴集、最小覆蓋),記為Fmin。

F中每個函數(shù)依賴的右部僅含有一個屬性。

F中每個函數(shù)依賴的左部不存在多余的屬性,即不存在這樣的函數(shù)依賴X→A,X有真子集Z使得F與(F-{X→A})∪{Z→A}等價。F中不存在多余的函數(shù)依賴,即不存在這樣的函數(shù)依賴X→A,使得F與F-{X→A}等價。135極小函數(shù)依賴集算法①

使F中每個函數(shù)依賴的右部都只有一個屬性。逐一檢查F中各函數(shù)依賴X→Y,若Y=A1A2…Ak(k≥2),則用{X→Aj|j=1,2,…k}取代X→Y。②

去掉各函數(shù)依賴左部多余的屬性。逐一取出F中各函數(shù)依賴X→A,設(shè)X=B1B2…Bm,逐一檢查Bi(i=1,2,…,m),如果A∈(X-Bi)F+,則以X-Bi取代X。136極小函數(shù)依賴集算法(續(xù))③

去掉多余的函數(shù)依賴。逐一檢查F中各函數(shù)依賴X→A,令G=F-{X→A},若A∈XG+,則從F中去掉X→A函數(shù)依賴。137例8-13設(shè)有如下兩個函數(shù)依賴集F1、F2,分別判斷它們是否是極小函數(shù)依賴集。F1={AB→CD,BE→C,C→G}F2={A→D,B→A,A→C,B→D,D→C}138例8-13(續(xù))解:對F1,由于函數(shù)依賴AB→CD的右部不是單個屬性,因此,該函數(shù)依賴集不是極小函數(shù)依賴集。對F2,由于A→C可由A→D和D→C導出,因此A→C是F2中的多余函數(shù)依賴,所以F2也不是極小函數(shù)依賴集。139例8-14設(shè)有關(guān)系模式R(U,F(xiàn)),其中U={A,B,C},F(xiàn)={A→BC,B→C,AC→B},求其極小函數(shù)依賴集Fmin。解:

讓F中每個函數(shù)依賴的右部為單個屬性。結(jié)果為:G1={A→B,A→C,B→C,AC→B}140例8-14(續(xù))

分析AC→B:

第1種情況:去掉C,計算AG1+=ABC,包含了B,因此AC→B中C是多余屬性,AC→B可化簡為A→B。第2種情況:去掉A,計算CG1+=C,不包含B,因此AC→B中A不是多余屬性。去掉左部多余屬性后的函數(shù)依賴集為:G2={A→B,A→C,B→C,A→B}={A→B,A→C,B→C}141例8-14(續(xù))去掉G2中多余的函數(shù)依賴。

對A→B,令G3={A→C,B→C},AG3+=AC,不包含B,因此A→B不是多余的函數(shù)依賴。

對A→C,令G4={A→B,B→C},AG4+=ABC,包含了C,因此A→C是多余的函數(shù)依賴,應(yīng)去掉。

對B→C,令G5={A→B,A→C},BG5+=B,不包含C,因此B→C不是多余的函數(shù)依賴。最終的極小函數(shù)依賴集Fmin={A→B,B→C}。142例8-15設(shè)有關(guān)系模式R(U,F(xiàn)),其中U={A,B,C},

F={AB→C,A→B,B→A}求其極小函數(shù)依賴集Fmin。143例8-15(續(xù))分析AB→C:第1種情況:去掉B,計算AF+=ABC,包含C,因此B是多余屬性,AB→C可化簡為A→C。故F簡化為:G1={A→C,A→B,B→A}第2種情況:去掉A,計算BF+=ABC,包含C,因此A是多余屬性,AB→C可化簡為B→C。故F可簡化為:G2={B→C,A→B,B→A}144例8-15(續(xù))(2)去掉G1和G2中的多余函數(shù)依賴。

去掉G1中的多余函數(shù)依賴。對A→C,令G11={A→B,B→A},AG11+=AB,不包含C,因此A→C不是多余的函數(shù)依賴。對A→B,令G12={A→C,B→A},AG12+=C,不包含B,因此A→B不是多余的函數(shù)依賴。

對B→A,令G13={A→C,A→B},BG13+=B,不包含A,因此B→A不是多余的函數(shù)依賴。最終的極小函數(shù)依賴集Fmin1=G1={A→C,A→B,B→A}。145例8-15(續(xù))②去掉G2中的多余函數(shù)依賴。

對B→C,令G21={A→B,B→A},BG21+=AB,不包含C,因此B→C不是多余的函數(shù)依賴。

對A→B,令G22={B→C,B→A},AG22+=A,不包含B,因此A→B不是多余的函數(shù)依賴。

對B→A,令G23={B→C,A→B},BG23+=BC,不包含A,因此B→A不是多余的函數(shù)依賴。最終的極小函數(shù)依賴集Fmin2=G2={B→C,A→B,B→A}。146本章內(nèi)容8.1關(guān)系規(guī)范化的意義8.2函數(shù)依賴8.3函數(shù)依賴的推理規(guī)則8.4范式8.5關(guān)系模式的分解準則1478.4范式關(guān)系規(guī)范化是指導將有“不良”函數(shù)依賴的關(guān)系模式轉(zhuǎn)換為良好的關(guān)系模式的理論。這里涉及到范式的概念,不同的范式表示關(guān)系模式遵守的不同的規(guī)則。

1488.4范式關(guān)系數(shù)據(jù)庫中的關(guān)系要滿足一定的要求,滿足不同程度要求的為不同的范式(NormalForm)。范式的種類:第一范式(1NF)第二范式(2NF)第三范式(3NF)BC范式(BCNF)第四范式(4NF)第五范式(5NF)1498.4范式(續(xù))1501NF2NF3NFBCNF4NF5NF8.4范式(續(xù))“第幾范式”表示關(guān)系模式滿足的條件。對關(guān)系模式的屬性間的函數(shù)依賴加以不同的限制,就形成了不同的范式。范式是遞進的。規(guī)范化的目的是設(shè)計“好的”關(guān)系模式。從而消除操作異常。1518.4.1第一范式定義:不包含非原子項屬性的關(guān)系都是第一范式(1NF)的關(guān)系。在1NF的關(guān)系中每一列都是不可分割的基本數(shù)據(jù)項,同一列中不能有多個值

。1528.4.1第一范式(續(xù))153非第一范式的關(guān)系系

名高級職稱人數(shù)教授副教授計算機系610信息管理系35通信工程系48規(guī)范化成第一范式的關(guān)系系

名教授人數(shù)副教授人數(shù)計算機系610信息管理系35通信工程系488.4.2第二范式如果R(U,F)∈1NF,并且R中的每個非主屬性都完全函數(shù)依賴于主鍵,則R(U,F)∈2NF??芍喝裟硞€第一范式關(guān)系的主鍵只由一個列組成,則這個關(guān)系就是第二范式關(guān)系。154示例1S-B-B(SID,Sname,Email,ISBN,bname,category,price,borrow_time,return_time)主鍵是(SID,ISBN,borrow_time),由于有Email只依賴于SID,因此(SID,ISBN,borrow_time)Email。結(jié)論:S-B-B不是第二范式關(guān)系。155分解方法(1)用組成主鍵的屬性集合的每一個子集作為主鍵構(gòu)成一個關(guān)系模式。(2)將依賴于這些主鍵的屬性放置到相應(yīng)的關(guān)系模式中。(3)最后去掉只由主鍵的子集構(gòu)成的關(guān)系模式。156示例1--分解S-B-B步驟1(1)將該關(guān)系模式分解為如下七個關(guān)系模式(下劃線部分表示主鍵):Students(SID,…)Book(ISBN,…)Borrow(borrow_time,…)Students-book(SID,ISBN,…)Students-borrow(SID,borrow_time,…)book-borrow(ISBN,borrow_time,…)Students-book-borrow(SID,ISBN,borrow_time,)157示例1--分解S-B-B步驟2(2)將依賴于這些主鍵的屬性放置到相應(yīng)的關(guān)系模式中,形成如下七個關(guān)系模式:①

Students(SID,Email)②

Book(ISBN,Bname,category,price)③

Borrow(borrow_time)④

Students-book(SID,ISBN)⑤

Students-borrow(SID,borrow_time)⑥

book-borrow(ISBN,borrow_time)⑦

Students-book-borrow(SID,ISBN,borrow_time,return_time)158示例1--分解S-B-B步驟3(3)去掉只由主鍵的子集構(gòu)成的關(guān)系模式。刪除③、④、⑤、⑥關(guān)系模式,S-B-B關(guān)系模式最終被分解為:①Students(SID,Email)②Book(ISBN,Bname,category,price)③Students-book-borrow(SID,ISBN,borrow_time,return_time)159例8-16

有關(guān)系模式:S-D-C(Sno,Sname,Ssex,Sdept,Dept_master,Cno,Grade),判斷是否為第二范式關(guān)系,如不是,分解到第二范式。因為Sno→Sname,因此存在:(Sno,Cno)Sname結(jié)論:S-D-C不是第二范式關(guān)系。160例8-16--分解S-D-C步驟1(1)將該關(guān)系模式分解為如下三個關(guān)系模式(下劃線部分表示主鍵):S-D(Sno,…)C(Cno,…)S-C(Sno,Cno,…)161例8-16--分解S-D-C步驟2(2)將依賴于這些主鍵的屬性放置到相應(yīng)的關(guān)系模式中,形成如下三個關(guān)系模式:S-D(Sno,Sname,Ssex,Sdept,Dept_master)C(Cno)S-C(Sno,Cno,Grade)162例8-16--分解S-D-C步驟3(3)去掉只由主鍵的子集構(gòu)成的關(guān)系模式,也就是去掉C(Cno)關(guān)系模式。

S-D-C關(guān)系模式最終被分解為:S-D(Sno,Sname,Ssex,Sdept,Dept_master)S-C(Sno,Cno,Grade)163例8-16(續(xù))S-D(Sno,Sname,Ssex,Sdept,Dept_master)存在插入異常。1648.4.3第三范式定義:如果R(U,F)∈2NF,并且所有的非主屬性都不傳遞依賴于主鍵,則R(U,F)∈3NF。關(guān)系模式S-D(Sno,Sname,Ssex,Sdept,Dept_master),主鍵為Sno,由于有: 因此: 結(jié)論:S-D不是3NF165分解方法(1)對于不是候選鍵的每個決定因子,從關(guān)系模式中刪去依賴于它的所有屬性。(2)新建一個關(guān)系模式,新關(guān)系模式中包含原關(guān)系模式中所有依賴于該決定因子的屬性。(3)將決定因子作為新關(guān)系模式的主鍵。166分解S-DS-D分解后的關(guān)系模式如下:S(Sno,Sname,Ssex,Sdept),Sdept為引用D的外鍵D(Sdept,Dept_master)S、D關(guān)系模式中不存在傳遞依賴,因此是3NF。167模式分解至此,S-D-C(Sno,Sname,Ssex,Sdept,Dept_master,Cno,Grade)被分解為三個關(guān)系模式S(Sno,Sname,Ssex,Sdept),Sdept為引用D的外鍵D(Sdept,Dept_master)S-C(Sno,Cno,Grade),Sno為引用S的外鍵。1688.4.4Boyce-Codd范式2NF和3NF都是不允許存在對主鍵的部分函數(shù)依賴和傳遞函數(shù)依賴,但這些定義并沒有考慮對候選鍵的依賴問題。第三范式的這些不足導致了另一種更強范式的出現(xiàn),即Boyce-Codd范式,簡稱BC范式或BCNF(BoyceCoddNormalForm)。1698.4.4Boyce-Codd范式(續(xù))BCNF是由Boyce和Codd共同提出的,它比3NF更進了一步,通常認為BCNF是修正的3NF。BCNF考慮了關(guān)系中對所有候選鍵的函數(shù)依賴。1708.4.4Boyce-Codd范式(續(xù))定義:如果R(U,F)∈1NF,若X→Y且Y?X時X必包含候選鍵,則R(U,F)∈BCNF當且僅當關(guān)系中的每個函數(shù)依賴的決定因子都是候選鍵時,該范式即為Boyce-Codd范式(BCNF)。1718.4.4Boyce-Codd范式(續(xù))大多數(shù)情況下3NF的關(guān)系模式都

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論