版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)庫系統(tǒng)基礎(chǔ)教程PrinciplesofDatabase第一頁,共一百一十二頁,編輯于2023年,星期三依賴?yán)碚撊藗儾捎枚喾N方法為一個(gè)應(yīng)用設(shè)計(jì)關(guān)系數(shù)據(jù)庫模式。初始的關(guān)系模式通常需要改進(jìn),尤其在消除冗余方面。一般來說,這些問題是由于模式試圖將過多的內(nèi)容合并到一個(gè)關(guān)系中而造成的。依賴?yán)碚撋婕叭绾螛?gòu)建一個(gè)良好的關(guān)系數(shù)據(jù)庫模式,以及當(dāng)一個(gè)模式存在缺陷時(shí)如何改進(jìn)。第二頁,共一百一十二頁,編輯于2023年,星期三3.1函數(shù)依賴關(guān)系R上的函數(shù)依賴是指“如果R的兩個(gè)元組在屬性A1,A2...An上一致,那么它們必定在其他屬性B1,B2...Bm上一致.該函數(shù)依賴記為:A1,A2...An->B1,B2...Bm。如果關(guān)系R的每個(gè)實(shí)例都能使一個(gè)給定的FD為真,那么稱R滿足函數(shù)依賴f。這是在R上聲明了一個(gè)約束,而不是僅僅針對(duì)R的一個(gè)特殊實(shí)例。例3.1考慮關(guān)系Movies(title,year,length,genre,sudioName,starName)函數(shù)依賴:titleyear->lengthgenrestudioNametitleyear->starName第三頁,共一百一十二頁,編輯于2023年,星期三3.1.2關(guān)系的鍵如果下列條件滿足,就認(rèn)為一個(gè)或多個(gè)屬性集{A1,A2,...An}是關(guān)系的鍵。這些屬性函數(shù)決定關(guān)系的所有其他屬性。也就是說,關(guān)系R不可能存在兩個(gè)不同的元組,它們具有相同的A1,A2,..,An值。在{A1,A2,...An}的真子集中,沒有一個(gè)能函數(shù)決定R的所有其他屬性。例3.2Movies1(title,year,length,genre,sudioName,starName)鍵為:(title,year,starName)有時(shí)一個(gè)關(guān)系可能會(huì)有多個(gè)鍵,通常需要指定一個(gè)為主鍵。超鍵:一個(gè)包含鍵的屬性集叫超鍵。第四頁,共一百一十二頁,編輯于2023年,星期三3.2函數(shù)依賴的規(guī)則例3.4如果關(guān)系R(A,B,C)滿足FD:A->B和B->C,那么久可以推斷出A->C。對(duì)于FD結(jié)合S和T而言,若關(guān)系實(shí)例集合滿足S與其滿足T的情況完全一樣,就認(rèn)為S和T等價(jià);若滿足T中所有FD的每個(gè)關(guān)系實(shí)例也滿足S中的所有FD,則認(rèn)為S是由T推斷而來的。當(dāng)且僅當(dāng)S是從T中推斷而來,并且T也是從S中推斷而來,S和T才是等價(jià)的。第五頁,共一百一十二頁,編輯于2023年,星期三3.2.2分解組合規(guī)則A1,A2...An->B1,B2...Bm等價(jià)于下列FD的集合A1,A2...An->B1,A1,A2...An->B2,....,A1,A2...An->Bm.分解規(guī)則不能應(yīng)用到FD的左邊,例3.6。3.2.3平凡函數(shù)依賴A1,A2...An->B1,B2...Bm,其中{B1,B2...Bm}屬于{A1,A2...An},平凡FD的右邊是左邊的子集。FD右邊的一些(而不是全部)屬性也在左邊出現(xiàn)。這個(gè)FD不是平凡函數(shù)依賴。平凡依賴規(guī)則:A1,A2...An->B1,B2...Bm等價(jià)于A1,A2...An->C1,C2,..Ck,Ci是集合B而不是集合A中的屬性。第六頁,共一百一十二頁,編輯于2023年,星期三3.2.4計(jì)算屬性的閉包假設(shè){A1,A2,...,An}是屬性集合,S是FD的集合,s集合下的屬性集合{A1,A2,...,An}的閉包是滿足下面條件的屬性集合B:每一個(gè)滿足S中所有FD的關(guān)系,也同樣滿足A1A2...An->B.記為{A1,A2,...,An}+.算法3.7屬性集合的閉包例3.8考慮含有屬性A,B,C,D,E,F的關(guān)系.假設(shè)此關(guān)系包含F(xiàn)D:AB->C,BC->AD,D->E和CF->B,求{A,B}+通過計(jì)算任一屬性集合的閉包,尅判斷任一給定的FDA1A2...An->B是否可以由FD集合S推斷.例3.9考慮上題中關(guān)系和FD集合,判斷AB->D水哦能從該FD集合推斷.第七頁,共一百一十二頁,編輯于2023年,星期三3.2.6傳遞規(guī)則若關(guān)系R中FDA1A2...An->B1B2...Bm和B1B2...Bm->C1C2...Ck都成立,那么FDA1A2...An->C1C2...Ck在R中成立。如果C中屬性屬于A,則可根據(jù)平凡依賴規(guī)則把它們從右邊消除。例3.10titleyear->studioNamestudioName->studioAddr第八頁,共一百一十二頁,編輯于2023年,星期三3.2.7函數(shù)依賴的閉包集合如果給定一個(gè)FD集合S(例如在某個(gè)關(guān)系中成立的FD集合),則任何核S等價(jià)的FD結(jié)合都被稱為S的等價(jià)集。我們關(guān)心的是一個(gè)關(guān)系完全FD集合的等價(jià)集。滿足下面三個(gè)條件的等價(jià)集B稱為關(guān)系的最小化基本集。B中所有FD的右邊均為單一屬性。從B中刪除任何一個(gè)FD后該集合不再是基本集。對(duì)于B中任何一個(gè)FD,如果從其左邊刪除一個(gè)或多個(gè)屬性,B將不再是基本集。例3.11考慮關(guān)系R(A,B,C),它的任一個(gè)屬性都能函數(shù)決定其他兩個(gè)屬性。第九頁,共一百一十二頁,編輯于2023年,星期三3.2.8投影函數(shù)依賴假設(shè)有一個(gè)含有FD集合S的關(guān)系R,通過計(jì)算R1=ΠL(R)對(duì)其部分屬性進(jìn)行投影。那么R1中有哪些FD成立?算法3.12例3.13第十頁,共一百一十二頁,編輯于2023年,星期三3.3關(guān)系數(shù)據(jù)庫模式設(shè)計(jì)不仔細(xì)選擇關(guān)系數(shù)據(jù)庫模式會(huì)帶來冗余和相應(yīng)的異常。titleyearlengthgenrestudioNamestarNameStarwarsStarwarsstarwarsMightDucksWayne’sworldWayne’sworld1977197719771991199219921241241241049595SciFiSciFiSciFiComedyComedyComedyFOXFoxFoxDisneyParamountParamountCarrieFisherMarkHamillHarrisonFordHarrisonFordDanaCarveyMikeMeyers第十一頁,共一百一十二頁,編輯于2023年,星期三3.3.1異常冗余:信息在多個(gè)元組中重復(fù)。更新異常:可能修改了某個(gè)元組的信息,但沒有修改其他元組中的相同信息。刪除異常:如果一個(gè)值集變成空集,則可能帶來丟失信息的副作用。3.3.2分解關(guān)系給定一個(gè)關(guān)系R(A1,A2,..,An),把他分解為關(guān)系S(B1,B2,...,Bm)和T(C1,C2,...,Ck),并且滿足:{A1,A2,..,An}={B1,B2,...,Bm}U{C1,C2,...,Ck}S=πB1,B2,...,Bm(R)T=πC1,C2,...,Cm(R)第十二頁,共一百一十二頁,編輯于2023年,星期三titleyearlengthfilmTypestudioNameStarwarsMightDucksWayne’sWorld19771991199212410495ColorColorColorFoxDisneyParamounttitleyearstarNameStarwarsStarwarsStarwarsMightDucksWayne’sWorldWayne’sWorld197719771977199119921992CarrieFisherMarkHamillHarrisonFordEmilioEstevezDanaCarveyMikeMeyers第十三頁,共一百一十二頁,編輯于2023年,星期三3.3.3Boyce-Codd范式一個(gè)簡單的條件可以保證前面討論的異常不存在。這個(gè)條件稱為Boyce-Codd范式。關(guān)系R屬于BCNF范式當(dāng)且僅當(dāng):如果R中非平凡FDA1A2...An->B1B2...Bm成立,則{A1,A2,...,An}是R的超鍵。例3.15圖3-6中的關(guān)系Movie1不屬于BCNF。例3.16圖3-7的關(guān)系Movie2屬于BCNF例3.17任意一個(gè)二元關(guān)系都屬于BCNF第十四頁,共一百一十二頁,編輯于2023年,星期三3.3.4分解為BCNF重復(fù)選擇適當(dāng)?shù)姆纸?,可以把任何一個(gè)關(guān)系模式分解為帶有下列重要性質(zhì)的具有多個(gè)屬性的子集:以這些子集為模式的關(guān)系都屬于BCNF原始關(guān)系中的數(shù)據(jù)都正確地反映在分解后的關(guān)系上,即原始關(guān)系應(yīng)能從分解后的幾個(gè)關(guān)系實(shí)例中重構(gòu)。要遵循的分解而策略是找出違反BCNF條件的非平凡FDA1A2...An->B1B2...Bm,并且{A1A2,...,An}不是超鍵。然后盡可能地向FD的右邊增加由{A1,A2,...,An}決定的屬性。其中一個(gè)模式包含了上述FD的所有屬性,而另一個(gè)包含了該FD左邊的屬性和不屬于該FD的所有屬性。第十五頁,共一百一十二頁,編輯于2023年,星期三例3.18考慮關(guān)系Movies1(title,year,length,genre,studioName,starName)titleyear->lengthgenrestudioName例3.19考慮具有如下模式的關(guān)系:{title,year,studioName,president,presAddr}titleyear->studioNamestudioName->presidentpresident->presAddr鍵為{title,year}第一步分解:StudioName->president;在右邊添加StudioName決定的屬性presAddr,于是為StudioName->president,presAddr;得到{title,year,studioName}和{sudioName,president,presAddr}第二步對(duì){sudioName,president,presAddr}進(jìn)行分解。president->presAddr第十六頁,共一百一十二頁,編輯于2023年,星期三3.4分解的優(yōu)劣分解應(yīng)當(dāng)具有以下三個(gè)性質(zhì):消除異常信息的可恢復(fù)。是否能夠從分解后的各個(gè)元組中恢復(fù)原始關(guān)系。依賴的保持:如果FD的投影在分解后的關(guān)系上成立,能否確保對(duì)分解后的關(guān)系用連接重構(gòu)獲取的原始關(guān)系仍然滿足原來的FD?3.4.1從分解中恢復(fù)信息使用3.20算法進(jìn)行分解,其中所有的分解都起因于一個(gè)違反BCNF的FD,那么將原始元組的投影進(jìn)行連接就可以生成所有原始元組,且僅生成原來那些原組??紤]關(guān)系R(A,B,C)和一個(gè)違反BCNF的FDB->C,分解為R1(a,b)和R2(b,c)如t=(a,b,c),投影后再連接能得到(a,b,c)另一方面,如R中有元組t=(a,b,c)和v=(d,b,e),投影后再進(jìn)行自然連接,不會(huì)產(chǎn)生偽元組。第十七頁,共一百一十二頁,編輯于2023年,星期三X,Y,Z是屬性集,R的屬性集為XUYUZ,那么R=πXUY(R)∞πYUZ(R)例3.21R(A,B,C),但關(guān)系中不存在A->B,B->C.ABC142235第十八頁,共一百一十二頁,編輯于2023年,星期三3.4.4依賴的保持在某些情況下,把一個(gè)關(guān)系分解為一系列BCNF關(guān)系時(shí),無法同時(shí)擁有無損連接和依賴保持兩種性質(zhì)。例3.25考慮關(guān)系Bookings(title,theater,city)theater->city,titlecity->theater鍵:{title,city}{theater,title}BCNF違例:theater->city,分解結(jié)果為{theater,city},{theater,title}原關(guān)系滿足titlecity->theater,但分解后的關(guān)系進(jìn)行連接操作后,產(chǎn)生的關(guān)系卻不滿足titlecity->theater。第十九頁,共一百一十二頁,編輯于2023年,星期三theatercityGuildParkMenloParkMenloParktheatertitleGuildParkAntzAntztheatercitytitleGuildParkMenloParkMenloParkAntzAntz第二十頁,共一百一十二頁,編輯于2023年,星期三3.5第三范式關(guān)系R屬于第三范式,如果它滿足:只要A1A2...An->B1B2...Bm是非平凡FD,那么或者{A1,A2,...,An}是超鍵,或者每個(gè)屬于B1,B2,...,Bm但不屬于A的屬性都是某個(gè)鍵的成員。如果一個(gè)屬性是某個(gè)鍵的成員,則常被稱為“主屬性”。因此3NF可以概括為:對(duì)于每個(gè)非平凡FD,或者其左邊是超鍵,或者其右邊僅由主屬性構(gòu)成。第二十一頁,共一百一十二頁,編輯于2023年,星期三3.5.23NF模式綜合算法算法3.26具有無損連接和依賴保持性質(zhì)的3NF關(guān)系綜合算法找出F的一個(gè)最小基本集,記為G。對(duì)于G中的每一個(gè)FDX->A,將XA作為分解出的某個(gè)關(guān)系的模式如果第2步分解出的關(guān)系的模式均不包含R的超鍵,則增加一個(gè)關(guān)系,其模式為R的任何鍵。例3.27考慮關(guān)系R(A,B,C,D,E),其上有FD:AB->C,C->B,A->D。上述FD集就是最小化基本集。S1(A,B,C),S2(B,C),S3(A,B),增加一個(gè)S4(A,B,E)(R的鍵有兩個(gè){A,C,E},{A,B,E}第二十二頁,共一百一十二頁,編輯于2023年,星期三第4章高級(jí)數(shù)據(jù)庫模型思考高級(jí)設(shè)計(jì)關(guān)系數(shù)據(jù)庫模式關(guān)系DBMS第二十三頁,共一百一十二頁,編輯于2023年,星期三4.1E/R模型4.1.1實(shí)體集4.1.2屬性:實(shí)體集具有相關(guān)的屬性,屬性是這個(gè)實(shí)體集中實(shí)體所具有的性質(zhì)。4.1.3聯(lián)系:兩個(gè)或多個(gè)實(shí)體集的連接。4.1.4實(shí)體-聯(lián)系圖:是描述實(shí)體集、屬性和聯(lián)系的圖示。第二十四頁,共一百一十二頁,編輯于2023年,星期三MoviesStarsStudiosStars-inOwnsnameaddresstitleyearlengthgenrenameaddress第二十五頁,共一百一十二頁,編輯于2023年,星期三4.1.5E/R圖實(shí)例一個(gè)E/R圖描述的數(shù)據(jù)庫包含特定的數(shù)據(jù),稱為數(shù)據(jù)庫實(shí)例。對(duì)于每個(gè)實(shí)體集,數(shù)據(jù)庫實(shí)例都有一個(gè)特定的有限實(shí)體集合。聯(lián)系集:連接n個(gè)實(shí)體集E1,E2,...,En的聯(lián)系R的一個(gè)實(shí)例由元組(e1,e2,...en)的有限集構(gòu)成。MoviesStarsBasicInstinctTotalRecallTotalRecallSharonStoneArnoldSchwarzenggerSharonStone第二十六頁,共一百一十二頁,編輯于2023年,星期三4.1.6二元E/R聯(lián)系的多樣性二元聯(lián)系能將一個(gè)實(shí)體集中任意數(shù)目的實(shí)體與另一個(gè)實(shí)體集中任意數(shù)目的實(shí)體相連接。如果E中的任一實(shí)體可以通過R和F中的至多一個(gè)實(shí)體連接,那么說R是從E到F的多對(duì)一聯(lián)系如果R既是從E到F的多對(duì)一聯(lián)系,又是從F到E的多對(duì)一聯(lián)系,那么R就是一對(duì)一聯(lián)系。如果R既不是從E到F的多對(duì)一聯(lián)系,又不是從F到E的多對(duì)一聯(lián)系,那么R就是多對(duì)多聯(lián)系。例4.4第二十七頁,共一百一十二頁,編輯于2023年,星期三4.1.7多路聯(lián)系ContractsStarsMoviesSudios第二十八頁,共一百一十二頁,編輯于2023年,星期三4.1.8聯(lián)系的角色一個(gè)聯(lián)系中一個(gè)實(shí)體集可能出現(xiàn)兩次或多次MoviesSequel-ofSequelOriginal第二十九頁,共一百一十二頁,編輯于2023年,星期三ContractsMoviesStarsStudiosProducingstudioStudioofstar第三十頁,共一百一十二頁,編輯于2023年,星期三4.1.9聯(lián)系的屬性有時(shí)需要把屬性與聯(lián)系相連,較之與聯(lián)系中的任何一個(gè)實(shí)體集相連更加方便。屬性的的值由聯(lián)系集中對(duì)應(yīng)的整個(gè)元組函數(shù)決定。ContractsMoviesStarsStudiossalary第三十一頁,共一百一十二頁,編輯于2023年,星期三4.1.10多路聯(lián)系到二元聯(lián)系的轉(zhuǎn)換連接實(shí)體集:它的實(shí)體被看作是多路聯(lián)系的聯(lián)系集的元組。然后,針對(duì)組成原來多路聯(lián)系元組的每個(gè)實(shí)體集,從連接實(shí)體集中引入多對(duì)一聯(lián)系。Star-ofMoviesContractsMovie-ofStarsStudiosStudioofstarProducingstudio第三十二頁,共一百一十二頁,編輯于2023年,星期三4.1.11E/R模型中的子類一個(gè)實(shí)體集中含有一些實(shí)體,這些實(shí)體擁有集合其他實(shí)體成員沒有的特殊性質(zhì)。這就需要定義實(shí)體集的子類。子類實(shí)體集與面向?qū)ο蠓椒ǖ淖宇惖膮^(qū)別MoviestitleyearlengthgenreisaisaCartoonsMurder-MysteriesweaponVoicesStars第三十三頁,共一百一十二頁,編輯于2023年,星期三4.2設(shè)計(jì)原則忠實(shí)性:忠實(shí)于應(yīng)用的具體要求。例4.13避免冗余:對(duì)每件事只說一次。簡單性:除非絕對(duì)需要,不要在你的設(shè)計(jì)中添加更多成分。選擇正確的聯(lián)系。例4.15.ContractsStarsMoviesSudios第三十四頁,共一百一十二頁,編輯于2023年,星期三選擇正確的聯(lián)系例4.16MoviesStarsStudiosStars-inOwnsWorks-for第三十五頁,共一百一十二頁,編輯于2023年,星期三選擇正確的元素種類人們可以選擇不同的設(shè)計(jì)元素的類型來表示現(xiàn)實(shí)世界。很多這樣的選擇介于是用屬性還是用實(shí)體集(聯(lián)系)來表示。例4.17電影公司是作為實(shí)體集還是作為電影的屬性?假設(shè)E是一個(gè)實(shí)體集,如果要把E用一個(gè)屬性或幾個(gè)其他實(shí)體集的屬性代替,必須滿足如下條件:所有與E有關(guān)的聯(lián)系必須有箭頭指向E.如果E有幾個(gè)屬性,那么必須沒有屬性能依賴于其他屬性。也就是說,E的唯一鍵是它所有的屬性。沒有聯(lián)系包含E多次。如果這些條件都符合,那么可以這樣代替實(shí)體集E;如果從實(shí)體集F到E有多對(duì)一聯(lián)系R,那么刪除R并把E的屬性作為F的屬性。如果有多路聯(lián)系R的箭頭指向E,E的屬性作為R的屬性,并刪除從R到E的弧。第三十六頁,共一百一十二頁,編輯于2023年,星期三例4.18用多路聯(lián)系還是用多個(gè)二元聯(lián)系如果只涉及到兩個(gè)電影公司,用多路聯(lián)系或連接實(shí)體集都是正確的。ContractsMoviesStarsStudiosProducingstudioStudioofstar第三十七頁,共一百一十二頁,編輯于2023年,星期三Studios-ofMoviesStarsStudiosContractsStar-ofMovie-of假設(shè)合同包含一個(gè)影星、一部電影和電影公司的任意集合。第三十八頁,共一百一十二頁,編輯于2023年,星期三4.3E/R模型中的約束
E/R模型中的鍵:實(shí)體集E的鍵是一個(gè)或多個(gè)屬性的集合K,對(duì)于來自于E的不同實(shí)體e1,e2,它們對(duì)鍵K中屬性沒有完全相同的值。每個(gè)實(shí)體集必須與一個(gè)鍵。一個(gè)實(shí)體集也可以有多個(gè)鍵。但是習(xí)慣上只選擇一個(gè)作為主鍵,所以就好像只有一個(gè)鍵一樣。當(dāng)一個(gè)實(shí)體集處于一個(gè)ISA層次時(shí),要求根實(shí)體集擁有鍵所需的所有屬性,并且每個(gè)實(shí)體集的鍵都可在根實(shí)體集中發(fā)現(xiàn)它的組成部分,而不管在這個(gè)層次中有多少個(gè)實(shí)體集是它的組成部分。E/R模型中鍵的表示。第三十九頁,共一百一十二頁,編輯于2023年,星期三4.3.3引用完整性在一段上下文中出現(xiàn)的值一定在另一段上下文中出現(xiàn)。例4.19度約束MoviesStudiosPresidentsOwnsRunsMoviesStarsStars-in<=10第四十頁,共一百一十二頁,編輯于2023年,星期三4.4弱實(shí)體集一個(gè)實(shí)體集的鍵是由另一個(gè)實(shí)體集的部分或全部屬性構(gòu)成,這樣的實(shí)體集叫做弱實(shí)體集。弱實(shí)體集有兩個(gè)來源,一是isa層次結(jié)構(gòu),二是連接實(shí)體集。例4.20一個(gè)電影公司可能有幾套拍攝班子。這些拍攝班子可能被一個(gè)電影公司指定為crew1、crew2等。CrewsUnit-ofnumberStudiosaddrname第四十一頁,共一百一十二頁,編輯于2023年,星期三例4.22連接實(shí)體集形成弱實(shí)體集StarsStudio-ofaddrMoviesnameContractssalaryStar-ofMovie-ofStudiosnameaddrtitleyear第四十二頁,共一百一十二頁,編輯于2023年,星期三4.4.2弱實(shí)體集的要求弱實(shí)體集的鍵由如下屬性組成:零個(gè)或多個(gè)它自己的屬性;從E到其他實(shí)體集的多對(duì)一聯(lián)系連接的鍵屬性。這些多對(duì)一聯(lián)系稱為E的支持聯(lián)系。,從E到達(dá)的實(shí)體集稱為支持實(shí)體集。從E到某個(gè)實(shí)體集F的多對(duì)一聯(lián)系R成為E的一個(gè)支持聯(lián)系,必須滿足如下條件:必須是從E到F的二元的多對(duì)一聯(lián)系。R必須有從E到F的引用完整性。F提供給E作鍵的屬性必須是F的鍵屬性。然而,如果F本身就是弱實(shí)體集,那么F提供給E的F的部分或全部鍵屬性是由支持聯(lián)系連接的一個(gè)或多個(gè)實(shí)體集G的鍵屬性。如果從E到F有多個(gè)不同的支持聯(lián)系,那么每個(gè)聯(lián)系被用來提供一份F的鍵的拷貝以幫助E鍵的形成。第四十三頁,共一百一十二頁,編輯于2023年,星期三4.4.3弱實(shí)體集的符號(hào)從弱實(shí)體集連接出去的多對(duì)一聯(lián)系不一定是支持聯(lián)系。例4.23圖4-22中,聯(lián)系studio-of不需要時(shí)支持聯(lián)系。第四十四頁,共一百一十二頁,編輯于2023年,星期三4.5從E/R圖到關(guān)系設(shè)計(jì)把E/R圖轉(zhuǎn)換為關(guān)系數(shù)據(jù)庫模式很直觀:每個(gè)實(shí)體集可以轉(zhuǎn)化為具有相同屬性集的關(guān)系;聯(lián)系也用關(guān)系轉(zhuǎn)換,替換的關(guān)系屬性就是聯(lián)系所連接的實(shí)體集的鍵集合。這兩條規(guī)則對(duì)大多數(shù)情況都適合,但需要考慮下面幾種特殊情況:弱實(shí)體集不能直接轉(zhuǎn)化為關(guān)系isa聯(lián)系和子類需要特殊對(duì)待;有時(shí),需要把兩個(gè)關(guān)系組合為一個(gè)關(guān)系。第四十五頁,共一百一十二頁,編輯于2023年,星期三4.5.1實(shí)體集到關(guān)系的轉(zhuǎn)換MoviesStarsStudiosStars-inOwnstitleyearlengthfilmTypenameaddressnameaddressnameaddressMarkHamill456OakRd.,BrentwoodCarrieFisher123MapleSt.,Hollywood第四十六頁,共一百一十二頁,編輯于2023年,星期三4.5.2E/R聯(lián)系到關(guān)系的轉(zhuǎn)化E/R模型中的聯(lián)系也可以用關(guān)系表示。對(duì)于聯(lián)系R中涉及的每一個(gè)實(shí)體集,它們的鍵屬性都是R關(guān)系模式的以部分。如果這個(gè)聯(lián)系有屬性,則它們也是R關(guān)系中的屬性。如果一個(gè)實(shí)體集以不同角色在聯(lián)系中多次出現(xiàn),則它的鍵屬性出現(xiàn)的次數(shù)就同角色出現(xiàn)的次數(shù)一樣多。第四十七頁,共一百一十二頁,編輯于2023年,星期三Owns(title,year,studioName)Stars-in(title,year,starName)titleyearstudioNameStarwars1977FoxMightyducks1991DisneyWayne’sworld1992Paramount第四十八頁,共一百一十二頁,編輯于2023年,星期三例4.27將多路聯(lián)系轉(zhuǎn)換為關(guān)系ContractsMoviesStarsStudiosProducingstudioStudioofstarContracts(starName,title,year,studioOfStar,producingStudio)第四十九頁,共一百一十二頁,編輯于2023年,星期三4.5.3關(guān)系組合有時(shí),從實(shí)體集和聯(lián)系中轉(zhuǎn)化而來的關(guān)系對(duì)于給定的數(shù)據(jù)而言并不是最好的。設(shè)R是從E到F的多對(duì)一聯(lián)系,我們可以將R組合到E的關(guān)系模式中,E的模式包含:E的所有屬性;F的鍵屬性;聯(lián)系R的任何屬性。對(duì)于一個(gè)不與F相連的E中實(shí)體而言,上述的2和3類型的屬性在e元組中的相應(yīng)分量取空值。例4.28titleyearlengthgenrestudioNameStarWars1977124sciFiFoxMightDucks1991104dramaDisneyWayne’sworld199295comedyParamount第五十頁,共一百一十二頁,編輯于2023年,星期三例4.29將多對(duì)多聯(lián)系組合到實(shí)體集關(guān)系模式中titleyearlengthgenrestudioNamestarNameStarWars1977124sciFiFoxCarrieFisherStarWars1977124sciFiFoxMarkHamillStarWars1977124sciFiFoxHarrisonEsteveyMightDucks1991104comedyDisneyEmilicEstevezWayne’sworld199295comedyParamountDanaCarvey第五十一頁,共一百一十二頁,編輯于2023年,星期三4.5.4處理弱實(shí)體集從弱實(shí)體集W得到的關(guān)系不僅要包含W的屬性,還要包含相應(yīng)的支持實(shí)體集的鍵屬性。與弱實(shí)體集相連的聯(lián)系,經(jīng)轉(zhuǎn)換所得的關(guān)系必須包含W的所有鍵屬性。支持聯(lián)系R不必轉(zhuǎn)換為關(guān)系。例4.30:Studios(name,addr)Crews(number,studioName,crewChief)Unit-of(number,studioName,name)CrewsUnit-ofnumberStudiosaddrnamecrewChief第五十二頁,共一百一十二頁,編輯于2023年,星期三考慮一下聯(lián)系unit-of,假設(shè)迪斯尼#3攝制組是迪斯尼公司的一員,聯(lián)系unit-of包含(Disney-crew-#3,Disney)轉(zhuǎn)換為關(guān)系后,相應(yīng)的元組為:(3,Disney,disney)因此,unif-of可簡化為unit-of(number,name),而這個(gè)模式是crew的以部分,因此不必轉(zhuǎn)換支持聯(lián)系。弱實(shí)體集轉(zhuǎn)換為關(guān)系的修改規(guī)則。若W是一個(gè)弱實(shí)體集,則W轉(zhuǎn)化為關(guān)系后的模式組成為:W的所有屬性.與W相連的支持聯(lián)系的所有屬性。針對(duì)每一個(gè)連接W的支持聯(lián)系,即從W到實(shí)體集E的多對(duì)一聯(lián)系,把E的所有鍵屬性加入到W的對(duì)應(yīng)關(guān)系中。第五十三頁,共一百一十二頁,編輯于2023年,星期三4.6子類結(jié)構(gòu)到關(guān)系的轉(zhuǎn)化遵照E/R觀點(diǎn):為任一個(gè)在層次中的實(shí)體集創(chuàng)建一個(gè)關(guān)系,它包含了根的鍵屬性和自身屬性。把實(shí)體看作屬于單個(gè)類的對(duì)象.對(duì)于每一個(gè)包含了根的子樹創(chuàng)建一個(gè)關(guān)系,這個(gè)關(guān)系的模式包括了子樹種所有實(shí)體集的所有屬性。使用空值。創(chuàng)建一個(gè)包含層次中所有實(shí)體集的屬性的關(guān)系。每個(gè)實(shí)體由一個(gè)元組表示,對(duì)于實(shí)體沒有的屬性,則設(shè)該元組的相應(yīng)分量為空。第五十四頁,共一百一十二頁,編輯于2023年,星期三4.6.1E/R方式轉(zhuǎn)換給每個(gè)實(shí)體集建立一個(gè)關(guān)系。如果實(shí)體集E不是層次中的根,則為了能夠區(qū)分元組表示的實(shí)體,關(guān)系E要包含根的鍵屬性和E本身的屬性。例4.31Movies(title,year,length,genre)MurderMysteries(title,year,weapon)Cartoons(title,year)Voices(title,year,starName)注意:(即屬于卡通片又屬于兇殺片的電影)在這三個(gè)關(guān)系中均有元組。另外,Cartoons的模式是Voices關(guān)系模式的子集。第五十五頁,共一百一十二頁,編輯于2023年,星期三4.6.2面向?qū)ο蠓椒杜e層次中所有可能的子樹。為每一個(gè)子樹構(gòu)造可以描述該子樹對(duì)應(yīng)的實(shí)體的關(guān)系。這個(gè)關(guān)系模式含有子樹中所有實(shí)體集的所有屬性。因?yàn)檫@種方法假定這些實(shí)體是屬于且只屬于一個(gè)類的對(duì)象。Movies(title,year,length,genre)MoviesC(title,year,length,genre)MoviesMM(title,year,length,genre,weapon)MoviesCMM(title,year,length,genre,weapon)如果Cartoons有自身的屬性,則所有的四個(gè)關(guān)系將會(huì)有不同的屬性集合。Voices(title,year,starName),是否有必要建立兩個(gè)這樣的關(guān)系?第五十六頁,共一百一十二頁,編輯于2023年,星期三4.6.3使用空值組合關(guān)系可以對(duì)一個(gè)實(shí)體集層次只創(chuàng)建一個(gè)關(guān)系。這個(gè)關(guān)系包含了層次中所有實(shí)體集的所有屬性。一個(gè)實(shí)體表現(xiàn)為關(guān)系中一個(gè)元組。例4.33Movies(title,year,length,genre,weapon)另外還必須為聯(lián)系Voice創(chuàng)建關(guān)系。第五十七頁,共一百一十二頁,編輯于2023年,星期三4.6.4各種方法的比較空值法對(duì)于所有屬性只使用一個(gè)關(guān)系,查詢易于實(shí)現(xiàn)。查詢“2008年的哪幾部影片放映時(shí)間長于150分鐘?”,如果使用直接E/R法,可以直接從Movies關(guān)系查到。如果使用”面向?qū)ο蠓ā?,則需要查詢所有的四個(gè)關(guān)系。查詢“放映時(shí)間長于150分鐘的卡通片中使用了什么武器?”,如果使用”面向?qū)ο蠓ā?,則只需查找MoviesCMM即可。如果使用“E/R”方法,則需要先查找Movies(lenght>150),再在Cartoons中查找是否這些電影是卡通,最后在MurderMysteries找出武器。如果傾向于使用盡量少的關(guān)系,使用空值法。其他兩種方法各有優(yōu)點(diǎn)。有時(shí)可能寧愿減少空間和避免重復(fù)信息。因?yàn)椤懊嫦驅(qū)ο蟆钡姆椒▽?duì)每個(gè)實(shí)體只使用一個(gè)元組,并且這個(gè)元組只含有對(duì)實(shí)體有意義的屬性的分量,所有這種方法占用盡可能少的空間。第五十八頁,共一百一十二頁,編輯于2023年,星期三4.7統(tǒng)一建模語言4.7.1UML類4.7.2UML類的鍵4.7.3關(guān)聯(lián):在類之間的二元聯(lián)系。關(guān)聯(lián)是對(duì)象對(duì)的集合,每個(gè)對(duì)象來自它連接的類。MoviestitlePK
yearPKlengthgenrefloatlengthHours(intlength);第五十九頁,共一百一十二頁,編輯于2023年,星期三例4.36studiosnamePKaddressMoviestitlePKyearPKlengthgenreStarsnamePKaddress0..10..*0..*0..*Stars-inOwns第六十頁,共一百一十二頁,編輯于2023年,星期三4.7.4自關(guān)聯(lián)一個(gè)關(guān)聯(lián)的兩端可以連接同一個(gè)類,這樣的關(guān)聯(lián)稱為資關(guān)聯(lián)。關(guān)聯(lián)類:它的屬性可以被認(rèn)為是依附的關(guān)聯(lián)的屬性。StarsnamePKaddressMoviestitlePKyearPKlengthgenreCompensationSalaryResiduals0..*0..*Stars-in第六十一頁,共一百一十二頁,編輯于2023年,星期三4.7.6UML中的子類UML允許類C有四種不同的子類完整對(duì)局部:每個(gè)類C中對(duì)象是否一定屬于某個(gè)子類?分離對(duì)重疊:如果一個(gè)對(duì)象可以在兩個(gè)或多個(gè)子類中,那么子類是重疊的。在一個(gè)典型的面向?qū)ο笙到y(tǒng)中子類是分離的。也就是說沒有對(duì)象可以在兩個(gè)類中。E/R模型自動(dòng)地允許重疊類。E/R模型和面向?qū)ο笙到y(tǒng)都允許完整和局部的子類。第六十二頁,共一百一十二頁,編輯于2023年,星期三例4.40MoviestitlePKyearPKlengthgenreCartoonsMurder-MysteriesWeaponCartoon-MurderMysteriesWeapontoVoice第六十三頁,共一百一十二頁,編輯于2023年,星期三4.7.7聚集和組合MoviestitlePKyearPKlengthgenrestudiosnamePKaddressPresidentsMovieExecscert#PKnameaddressnetworth1..*0..1第六十四頁,共一百一十二頁,編輯于2023年,星期三4.8UML圖到關(guān)系的轉(zhuǎn)化類到關(guān)系關(guān)聯(lián)到關(guān)系例4.42Stars-In(movieTitle,movieYear,starName)Owns(movieTitle,movieYear,studioName)Stars-In(movieTitle,movieYear,starName,salary,rediduals)不必為關(guān)聯(lián)類單獨(dú)創(chuàng)建關(guān)系第六十五頁,共一百一十二頁,編輯于2023年,星期三4.8.2從UML子類到關(guān)系跟Isa結(jié)構(gòu)一樣,也包括了E/R方法、面向?qū)ο蠓椒?、空值法。如果層次的每一層都是分離的,那么建議使用面向?qū)ο蠓椒āH绻麑哟卧诿恳粚蛹仁峭暾挠质欠蛛x的,那么任務(wù)相對(duì)簡單。如果使用面向?qū)ο蠓椒?,那么只要為層次中葉子節(jié)點(diǎn)的來構(gòu)建關(guān)系。如果層次很大并且在某些或者所有的層次上是重疊的,那么E/R方法是合適的。4.8.3從聚集與組合到關(guān)系不為聚集和組合構(gòu)建關(guān)系,為非菱形端的類添加菱形端類的鍵屬性。在聚集情況下,這些屬性可以為空。例4.43MovieExecs(cert#,name,address,netWorth)Presidents(cert#,studioName)Moivies(title,year,length,genre,studioName)Studios(name,address)第六十六頁,共一百一十二頁,編輯于2023年,星期三4.8.4UML與弱實(shí)體集的對(duì)比與E/R不同,UML遵循面向?qū)ο蟮膫鹘y(tǒng),每個(gè)對(duì)象都有自己的對(duì)象標(biāo)識(shí)。也就是說,既是它們的每個(gè)屬性和其他性質(zhì)都具有相同的值,兩個(gè)對(duì)象也是可以區(qū)分開來。即使已有的類的屬性不能唯一標(biāo)識(shí)一個(gè)類的對(duì)象,也可以創(chuàng)鍵一個(gè)新的屬性來作為對(duì)應(yīng)關(guān)系的鍵并標(biāo)識(shí)對(duì)象的對(duì)象標(biāo)識(shí)。UML中,也可能像在E/R模型中為弱實(shí)體集使用支持聯(lián)系一樣使用一個(gè)組合(支持組合)。CrewsnamePKcrewChiefstudiosnamePKaddress1..1PK0..*第六十七頁,共一百一十二頁,編輯于2023年,星期三實(shí)驗(yàn)一數(shù)據(jù)庫的創(chuàng)建一、實(shí)驗(yàn)?zāi)康恼莆誗Qlserver中數(shù)據(jù)庫的創(chuàng)建及分離(附加)操作,掌握簡單查詢語句的應(yīng)用。二、實(shí)驗(yàn)內(nèi)容1、創(chuàng)建產(chǎn)品數(shù)據(jù)庫(P29)2、執(zhí)行查詢語句(P152習(xí)題6.1.3,d)-f);P158習(xí)題6.2.2a)-e);任選5題)。3、執(zhí)行數(shù)據(jù)庫的分離和附加操作。第六十八頁,共一百一十二頁,編輯于2023年,星期三實(shí)驗(yàn)二SQL查詢語句一、實(shí)驗(yàn)?zāi)康恼莆誗QL查詢語句的應(yīng)用方法。二、實(shí)驗(yàn)內(nèi)容P165習(xí)題6.3.1a),b),d),e);P171習(xí)題6.4.6a)-f);任選6題。第六十九頁,共一百一十二頁,編輯于2023年,星期三實(shí)驗(yàn)三數(shù)據(jù)庫的更新一、實(shí)驗(yàn)?zāi)康恼莆帐褂肧QL語句更新數(shù)據(jù)庫的方法。二、實(shí)驗(yàn)內(nèi)容P173習(xí)題6.5.1a)-g);任選6題。第七十頁,共一百一十二頁,編輯于2023年,星期三實(shí)驗(yàn)四數(shù)據(jù)庫設(shè)計(jì)某商業(yè)企業(yè)須設(shè)計(jì)一個(gè)管理信息系統(tǒng),對(duì)企業(yè)的各種產(chǎn)品、客戶、供應(yīng)商、運(yùn)貨商信息進(jìn)行綜合管理,按下面要求設(shè)計(jì)數(shù)據(jù)庫模式。要求畫出E-R模型,然后將起轉(zhuǎn)換為關(guān)系模式并進(jìn)行優(yōu)化,注意不要造成數(shù)據(jù)冗余和異常。企業(yè)銷售的產(chǎn)品分成多個(gè)類型,每種產(chǎn)品屬于一個(gè)類型。每種產(chǎn)品可由多個(gè)供應(yīng)商提供,每個(gè)供應(yīng)商提供多種產(chǎn)品。對(duì)于每種產(chǎn)品須記錄如下信息:產(chǎn)品名稱、供應(yīng)商、庫存數(shù)量、單價(jià)、訂購數(shù)量等。對(duì)每個(gè)類型須記錄類型名稱、類型說明。對(duì)于供應(yīng)商須保存供應(yīng)商名、聯(lián)系電話信息。企業(yè)具有多位員工,分別來自多個(gè)地區(qū)。對(duì)于每位員工保存的信息有:員工姓名、頭銜、出生日期、雇用日期、家庭地址、所在城市、所在地區(qū)、郵編、宅電、照片。第七十一頁,共一百一十二頁,編輯于2023年,星期三企業(yè)有很多客戶,對(duì)于每位客戶須記錄如下信息:客戶姓名、所在公司名稱、、客戶頭銜、聯(lián)系地址、所在城市、所在地區(qū)、郵編、國家、電話、傳真。企業(yè)具有多個(gè)運(yùn)貨商,須記錄運(yùn)貨商的公司名稱、聯(lián)系電話??蛻粝蚱髽I(yè)訂購產(chǎn)品,須填寫訂單。每筆訂單涉及一位客戶,由一位員工負(fù)責(zé)。訂單中的信息有:客戶名、員工名、訂購日期;發(fā)貨日期、運(yùn)貨商、運(yùn)費(fèi)、貨主姓名、貨主地址、貨主所在城市、貨主所在地區(qū)、貨主郵編、貨主所在國家。另外,每筆訂單還涉及到多種產(chǎn)品,須記錄客戶購買每種產(chǎn)品的單價(jià)、數(shù)量和折扣。對(duì)于企業(yè)經(jīng)營活動(dòng)所涉及到的每個(gè)地區(qū),須記錄地區(qū)名、地區(qū)的相關(guān)描述。第七十二頁,共一百一十二頁,編輯于2023年,星期三第7章約束和觸發(fā)器主動(dòng)元素:一個(gè)表達(dá)式或語句。該表達(dá)式或語句只只需要編寫一次,存儲(chǔ)在數(shù)據(jù)庫中,然后在適當(dāng)時(shí)候被執(zhí)行。應(yīng)用程序編寫者面臨的一個(gè)重要問題是,當(dāng)更新數(shù)據(jù)庫時(shí),新的信息有可能存在各種形式的錯(cuò)誤。SQL提供了各種技術(shù)把完整性約束作為數(shù)據(jù)庫的一部分。第七十三頁,共一百一十二頁,編輯于2023年,星期三7.1,鍵和外鍵SQL中可以將關(guān)系一個(gè)屬性或?qū)傩越M聲明為外鍵,該外鍵引用另一個(gè)關(guān)系(也可以是同一個(gè)關(guān)系)的屬性(組)。它隱含了兩重意思。例7.1studio(name,address,presC#)MovieExec(name,address,cert#,networth)createTableStudio(namechar(30)primaraykey,addressvarchar(255)presC#int,foreignkey(presC#)referencesMovieExec(cert#));第七十四頁,共一百一十二頁,編輯于2023年,星期三7.1.2維護(hù)引用完整性模式設(shè)計(jì)者可以從三種方法選擇強(qiáng)制外鍵約束。DBMS將阻止如下行為:對(duì)Studio插入一新元組,其presC#值非空,但它不是MovieEexc關(guān)系中任何元組的Cert#值。修改Studio關(guān)系元組的presC#屬性為非空值,但該值不是MovieEexc關(guān)系中任何元組的Cert#值。刪除MovieExec元組,該元組的cert#值非空,是一個(gè)或多個(gè)studio元組的presC#值。修改MovieExec元組的cert#值,而舊的cert#值是某電影公司的presC#值。第七十五頁,共一百一十二頁,編輯于2023年,星期三對(duì)于后兩種更新,有三種選擇:缺省原則:拒絕違法更新級(jí)聯(lián)原則置空原則createTableStudio(namechar(30)primaraykey,addressvarchar(255)presC#intreferencesMovieExec(cert#)ondeletesetnullonupdatecascade);第七十六頁,共一百一十二頁,編輯于2023年,星期三7.1.3延遲約束檢查考慮例7.1的兩個(gè)關(guān)系:studio(name,address,presC#)MovieExec(name,address,cert#,networth如果presC#是外鍵(引用cert#)。insertintostudiovalues(‘LaVista’,’newYork’,23456);//違反外鍵約束。解決方法是在studio中先插入presC#屬性值為空的元組。再在MovieExec中插入元組,最后修改studio,使得presC#變?yōu)?3456或者一開始就先在MovieExec中插入元組,然后才在studio中插入元組。第七十七頁,共一百一十二頁,編輯于2023年,星期三循環(huán)約束例7.3如果電影制片人被約束為是電影公司經(jīng)理,則要聲明cert#是引用studio(presC#)的外鍵。于是presC#bixu被聲明為UNIQUE。循環(huán)約束的解決方法:首先,必須將兩個(gè)插入操作組成一個(gè)單一的事務(wù);然后有一種方法通知DBMS不要檢查其約束,知道整個(gè)事務(wù)完成執(zhí)行并要提交為止。任何約束的聲明—鍵、外鍵或其他將在本章中見到的約束—后面可以有deferrable或notdeferrable選項(xiàng)。后者是缺省值,意味著每次執(zhí)行一條數(shù)據(jù)庫更新語句時(shí),隨后立即檢查該約束。defferrable后還有initiallydeferred和initiallyimmediate選項(xiàng)。第七十八頁,共一百一十二頁,編輯于2023年,星期三
createtablestudio(namechar(30)primarykey,addressvarhcar(255),presC#intUNIQUEreferecesMovieExec(cert#)deferrableinitiallydeferred);任何類型的約束都可以命名。如果約束有名字,比如MyConstraint,就可以用如下SQL語句將該約束從立即檢查改為推遲檢查。setconstraintMyConstraintDeferredsetconstraintMyConstraintimmediate第七十九頁,共一百一十二頁,編輯于2023年,星期三7.2屬性和元組上的約束createtable語句可以聲明兩種約束:在單一屬性上的約束;在整個(gè)元組上的約束非空值約束(notnull)插入元組時(shí),不能有空值;前面的置空值原則失效(P186);第八十頁,共一百一十二頁,編輯于2023年,星期三7.2.2基于屬性的check約束check后面的條件是該屬性的每個(gè)值都應(yīng)滿足的條件。條件可以引用其他屬性或其他關(guān)系,但該關(guān)系必須子查詢的形式出現(xiàn)。check約束是在元組為該屬性獲得新值時(shí)被檢查。如果數(shù)據(jù)庫的修改沒有改變與約束相關(guān)的屬性,則不進(jìn)行基于屬性的check約束檢查。例7.6假設(shè)證書號(hào)必須至少有6為數(shù)字。createtablestudio(namechar(30),addressvarchar(200),presC#intreferencesMovieExec(cert#)check(presC#>=10000)MovieStar(name,address,gender,birthdate)genderchar(1)check(genderin(‘F’,’M’));第八十一頁,共一百一十二頁,編輯于2023年,星期三例7.7使用基于屬性的check的約束模擬引用完整性。studio(name,address,presC#)MovieExec(name,address,cert#,networth)presC#intcheck(presC#in(selectcert#FROMMovieExec))對(duì)studio引入一個(gè)不是MovieExec中cert#值的presC#值時(shí),這樣的修改將被拒絕。但是如果改變MoiveExec關(guān)系,比方說刪除電影公司的經(jīng)理元組,此變化對(duì)上述check約束不可見。于是刪除操作被執(zhí)行,即使這樣導(dǎo)致presC#上基于屬性的Check約束被違反。第八十二頁,共一百一十二頁,編輯于2023年,星期三7.2.3基于元組的Check約束每次向R插入元組以及當(dāng)R的元組被修改時(shí),都要檢查基于元組的check約束條件。要為這個(gè)新元組或被修改的元組計(jì)算條件。如果該元組的約束條件計(jì)算結(jié)果是假,則表明違反約束,違規(guī)的插入和修改語句被拒絕。createtableMovieStar(namechar(30)primarykey,addressvarchar(255),genderchar(1),birthdatedate,check(gender=‘F’ornamenotlike‘Ms.%’));第八十三頁,共一百一十二頁,編輯于2023年,星期三7.2.4基于元組和基于屬性的約束的比較如果元組上的約束設(shè)計(jì)該元組的多個(gè)屬性,那么它必須作為基于元組的約束。但是如果約束僅涉及元組的一個(gè)屬性,那么可以作為基于元組或基于屬性的約束。當(dāng)僅涉及該元組的一個(gè)屬性(不計(jì)條件中子查詢)時(shí),不管作為基于元組還是基于屬性的約束,條件檢查是一樣的。但是基于元組的約束將比基于屬性的約束更頻繁地被檢查,只要該元組的任一個(gè)屬性被改變,而不是僅當(dāng)在約束中提及的屬性改變時(shí)都要檢查。第八十四頁,共一百一十二頁,編輯于2023年,星期三7.3修改約束給約束命名namechar(30)constranintNameisKeyPrimarykey,genderchar(1)constraintNoAndrocheck(genderIn(‘F’,’M’)),constraintRightTitlecheck(gender=‘F’ornameNotLIKE‘’MS.%’)setconstraint語句可以改變約束檢查執(zhí)行的方式(延期或立即執(zhí)行)。altertable語句可以刪除或添加約束。添加的約束必須是與元組相關(guān),如基于元組的約束、鍵或外鍵約束。另外添加的約束應(yīng)該讓現(xiàn)有的表中元組不要違反此約束。第八十五頁,共一百一十二頁,編輯于2023年,星期三例7.10altertalbemovieStardropconstraintNameIsKey;altertalbemovieStardropconstraintNoAndro;altertalbemovieStardropconstraintRightTitle;altertalbeMovieStaraddconstraintNameIsKeyprimarykey(name);altertalbeMovieStaraddconstraintNoAndrocheck(genderIn(‘F’,’M’));altertalbeMovieStaraddconstraintRightTitlecheck(gender=‘F’ornamenotlike‘Ms.%’)這些約束都是基于元組二步是基于屬性的檢查,不能恢復(fù)到基于屬性的約束。第八十六頁,共一百一十二頁,編輯于2023年,星期三7.4斷言斷言與特定的元組或元組的分量并不相關(guān)。它是數(shù)據(jù)庫模式的一部分,DBMS必須推斷數(shù)據(jù)庫的任何更新是否影響斷言的真假。例7.11假若希望其凈資產(chǎn)值少于10000000的任不能成為電影公司經(jīng)理??梢詣?chuàng)建一個(gè)斷言聲明經(jīng)理凈資產(chǎn)值少于10000000美元的電影公司集合是空。createassertionRichPrescheck(notexists(selectfromstudio,MovieExecwherepresC#=cert#andnetWorth<1000000));第八十七頁,共一百一十二頁,編輯于2023年,星期三例7.12Movie(title,year,length,genre,studioName,producerC#)createassertionSumLengthcheck(10000>=all(selectsum(length)fromMoviesgroupbystudioName));該約束至涉及關(guān)系Movies,似乎可以用基于元組的check約束,但實(shí)際上兩者有一些區(qū)別。checkcheck(10000>=all(selectsum(length)fromMoviesgroupbystudioName));dropassertionSumLength;第八十八頁,共一百一十二頁,編輯于2023年,星期三7.5觸發(fā)器僅當(dāng)數(shù)據(jù)庫程序員聲明的事件發(fā)生時(shí),觸發(fā)器被激活。事件種類通常是對(duì)特定關(guān)系的插入、刪除或修改。當(dāng)觸發(fā)器被事件激活時(shí),觸發(fā)器測(cè)試動(dòng)作條件。如果條件不成立,觸發(fā)動(dòng)作不會(huì)被執(zhí)行。如果觸發(fā)器的動(dòng)作條件滿足,觸發(fā)動(dòng)作由DBMS執(zhí)行。觸發(fā)動(dòng)作可以是以某種方式修改事件的結(jié)果,甚至可以撤銷事件所在的事務(wù)。第八十九頁,共一百一十二頁,編輯于2023年,星期三例7.13createtriggerNetWorthFriggerafterupdateofnetWorthOnMovieExecreferencingoldrowasoldTuple,newrowasnewTupleforeachrowwhen(OldTWorth>NewTWorth)updateMovieExecSetnetWorth=oldTWorthwherecert#=newTuple.cert#;第九十頁,共一百一十二頁,編輯于2023年,星期三7.5.2觸發(fā)器設(shè)計(jì)的選項(xiàng)after、before:指明條件測(cè)試和動(dòng)作執(zhí)行將在觸發(fā)事件之后的數(shù)據(jù)庫狀態(tài)上被執(zhí)行。insteadof用于視圖修改。update、insert、delete:觸發(fā)事件,of短語在insert、delete事件中不可用。when短語是可選項(xiàng)。如果該短語缺省,則只要觸發(fā)器被喚醒,都要執(zhí)行動(dòng)作。動(dòng)作可以是多個(gè)SQL語句。當(dāng)行級(jí)觸發(fā)器的觸發(fā)事件是修改時(shí),則有舊元組和信元組之分,分別表示修改之前和修改之后的元組。它們用oldrowas和newrowas短語命名。foreachrow(foreachstatement):行級(jí)觸發(fā)器或語句級(jí)觸發(fā)器。在語句級(jí)觸發(fā)器中,不能直接引用舊的和新的元組。但是無論語句級(jí)觸發(fā)器還是行級(jí)觸發(fā)器,都可以引用舊元組的關(guān)系和新元組的關(guān)系,聲明方式是使用保留字oldtableasoldStuff和newtableasnewStuff。第九十一頁,共一百一十二頁,編輯于2023年,星期三例7.14假定要阻止電影制作人的平均凈資產(chǎn)值降到500000美元。在對(duì)關(guān)系MovieExec(name,address,cert#,netWorth)的netWorth列做插入、刪除或修改時(shí)可能違反上述約束。注意:在一個(gè)插入(刪除或修改)語句中可以改變?cè)S多元組。所以需要多個(gè)語句級(jí)觸發(fā)器。第九十二頁,共一百一十二頁,編輯于2023年,星期三createtriggerAvgNetWorthTriggerafterupdateofnetWorthOnMovieExecreferencingoldtableasoldStuff,newTableasnewStuffforeachstaementwhen(50000>(selectavg(netWorth)fromMovieExec))begindeletefromMovieExecwhere(name,address,cert#,netWroth)innewStuff;insertintoMovieExec(select*fromoldStuff);end;第九十三頁,共一百一十二頁,編輯于2023年,星期三例7.15before觸發(fā)器的重要用途,是在插入元組之前以某種方式處理被插入的元組。在關(guān)系Movie(title,year,length,genre,sudiName,producerC#)插入元組,確保year不能為空。
createtriggerFixYearTriggerbeforeinsertonMoviesreferencingnewrowasnewRownewtableasnewStuffforeachrowwhennewRow.yearisnullupdatenewStuffsetyear=1995;第九十四頁,共一百一十二頁,編輯于2023年,星期三第8章視圖和索引8.1虛擬視圖虛擬視圖是由其他關(guān)系上的查詢所定義的一種關(guān)系。虛擬視圖并不再數(shù)據(jù)庫進(jìn)行存儲(chǔ),但是可以對(duì)其進(jìn)行查詢,就好像它確實(shí)存儲(chǔ)在數(shù)據(jù)庫中一樣。查詢處理器會(huì)在執(zhí)行查詢時(shí)用視圖的定義來替換視圖。例8.1定義視圖:由paramountStudos制作的所有電影的片名和年份所組成。
createviewParamountMoviesasselecttitle,yearfromMovieswherestudioName=‘Paramount’;第九十五頁,共一百一十二頁,編輯于2023年,星期三例8.2建立一個(gè)包含電影名和制片人姓名的關(guān)系MovieProd。Movie(title,year,length,genre,studioName,producerC#)MovieExex(name,address,cert#,netWorth)createviewMovieProdasselecttitle,namefromMovies,MovieExecwhereproducerC#=cert#;第九十六頁,共一百一十二頁,編輯于2023年,星期三8.1.2視圖查詢視圖可以像一個(gè)被真正存儲(chǔ)的表一樣來查詢。查詢中可以同時(shí)使用視圖和基本表。解釋包含虛擬視圖查詢最簡單方式是將From子句后面的視圖用等價(jià)的視圖定義查詢替換。如例8.4.selctdistinctstarNamefromPramountMovies,StarsInwheretitle=MovieTitleandyear=movieYear;selctdistinctstarNamefrom(selecttitle,yearfromMovieswherestudioName=‘Paramount’;)Pm,StarsInwherePm.title=MovieTitleandPm.year=movieYear;第九十七頁,共一百一十二頁,編輯于2023年,星期三8.1.3屬性重命名createviewMovieProd(movieTitle,prodName)asselecttitle,namefromMovies,MovieExecwhereproducerC#=cert#;第九十八頁,共一百一十二頁,編輯于2023年,星期三8.2視圖更新對(duì)視圖的更新轉(zhuǎn)變成一個(gè)等價(jià)的對(duì)基本表的更新,更新操作最終作用在基本表上。8.2.1視圖刪除dropviewParamountMovies;dropTableMovies第九十九頁,共一百一十二頁,編輯于2023年,星期三8.2.2可更新視圖粗略地講,可更新視圖是從單個(gè)關(guān)系R(R本身可能是一個(gè)可更新視圖)選取出(用select關(guān)鍵字,而非selectdistinct)的一些屬性組成。where子句在子查詢中不能使用關(guān)系RFrom語句智能包含一個(gè)關(guān)系R,不能再有其他關(guān)系。select語句匯總的蘇醒列表必須包括做夠多的屬性,以保證能夠用NULL或者適當(dāng)?shù)哪J(rèn)值來填充所有其他不屬于該視圖的屬性。第一百頁,共一百一十二頁,編輯于2023年,星期三例8.5向視圖ParamountMovies中插入一個(gè)元組insertintoParamountMoviesvalues(‘StarTrek‘,1979);studioName的值為null,所以對(duì)視圖ParamountMovies沒有任何影響,查詢視圖將不會(huì)出現(xiàn)剛才的元組。視圖可修改如下:
createviewParamountMoviesasselecttitle,yearstudioNamefromMovieswherestudioName=‘Paramount’;第一百零一頁,共一百一十二頁,編輯于2023年,星期三在可更新視圖中刪除元組和更新元組為了保證刪除的是那些智能在視圖中看到的元組,要把視圖的where語句中的條件添加(用and)到刪除操作的where子句中。例8.6deletefromParamountMovieswheretitlelike‘%Trek%’;被轉(zhuǎn)換成:deletefromParamountMovieswheretitlelike‘%Trek%’andstudioName=‘paramount’第一百零二頁,共一百一十二頁,編輯于2023年,星期三8.2.3視圖中的替換觸發(fā)器當(dāng)視圖上定義一個(gè)觸發(fā)器時(shí),可使用insteadof選項(xiàng)。如果這樣做,那么當(dāng)一個(gè)觸發(fā)事件喚醒
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 家庭教育方法與兒童情感發(fā)展的研究報(bào)告
- 2025關(guān)于商品房買賣合同
- 2025樓房施工合同范本
- 2025-2030年中國高密度聚乙烯薄膜行業(yè)市場(chǎng)運(yùn)營現(xiàn)狀及投資前景規(guī)劃研究報(bào)告
- 2025-2030年中國馬鈴薯市場(chǎng)競(jìng)爭格局與前景發(fā)展策略分析報(bào)告
- 2025-2030年中國食品乳化劑行業(yè)市場(chǎng)發(fā)展?fàn)顩r及投資前景規(guī)劃研究報(bào)告
- 2025-2030年中國集尿袋市場(chǎng)前景展望與投資發(fā)展戰(zhàn)略分析報(bào)告
- 2025-2030年中國鋁塑板行業(yè)市場(chǎng)競(jìng)爭格局展望及投資策略分析報(bào)告
- 2025-2030年中國鐵路用鋼行業(yè)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國造紙機(jī)械行業(yè)發(fā)展趨勢(shì)及前景調(diào)研分析報(bào)告
- 2025-2030年中國糖醇市場(chǎng)運(yùn)行狀況及投資前景趨勢(shì)分析報(bào)告
- 八年級(jí)散文閱讀專題訓(xùn)練-八年級(jí)語文上冊(cè)知識(shí)梳理與能力訓(xùn)練
- 2024年杭州市中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 2024-2025學(xué)年人教版八年級(jí)數(shù)學(xué)上冊(cè)期末測(cè)試模擬試題(含答案)
- 《環(huán)境感知技術(shù)》2024年課程標(biāo)準(zhǔn)(含課程思政設(shè)計(jì))
- GB/T 45079-2024人工智能深度學(xué)習(xí)框架多硬件平臺(tái)適配技術(shù)規(guī)范
- 2024年安徽省銅陵市公開招聘警務(wù)輔助人員(輔警)筆試自考練習(xí)卷二含答案
- 國家安全教育高教-第六章堅(jiān)持以經(jīng)濟(jì)安全為基礎(chǔ)
- 水處理藥劑采購項(xiàng)目技術(shù)方案(技術(shù)方案)
- 2024年城市環(huán)衛(wèi)一體化服務(wù)合同
- 工地春節(jié)安全培訓(xùn)
評(píng)論
0/150
提交評(píng)論