




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第二章范式及其對數(shù)據(jù)庫設計的指導意義匯報人:AiPPTDESIGN時間:202X.XCONTENTS范式理論概述01目錄第一范式(1NF)02第二范式(2NF)03第三范式(3NF)04BCNF(擴充的第三范式)05范式的局限性0601范式理論概述01范式是設計數(shù)據(jù)庫中數(shù)據(jù)表的邏輯結(jié)構(gòu)時應遵循的規(guī)則。范式的主要目的是消除數(shù)據(jù)冗余和異常,使數(shù)據(jù)庫設計更加高效和合理。02范式的定義消除數(shù)據(jù)冗余避免異常提高效率范式的作用范式的基本概念范式層次1NF:表中所有列都是不可再分的原子項。2NF:在1NF基礎上,非主屬性完全函數(shù)依賴于候選碼。3NF:在2NF基礎上,非主屬性不傳遞函數(shù)依賴于候選碼。BCNF:在3NF基礎上,所有屬性(包括主屬性)都不部分或傳遞函數(shù)依賴于候選碼。4NF:消除多值依賴帶來的冗余。5NF:消除連接依賴帶來的冗余。6NF:理論上最高范式,實際應用較少。范式包含關(guān)系1NF?2NF?3NF?BCNF?4NF?5NF?6NF范式之間的關(guān)系02第一范式(1NF)0102表中所有列必須是不可再分的原子項,即每個字段的值不能再分解為更小的部分。例如,學生成績表中,成績不能是一個包含多門課程成績的復合字段,而應拆分為“高等數(shù)學”“英語”“計算機科學”等單獨的列。原子性表中不能包含重復的數(shù)據(jù)項,即每一列的數(shù)據(jù)項必須是唯一的,不能有多個相同的數(shù)據(jù)項。例如,學生信息表中,不能將多個電話號碼放在一個“電話”字段中,而應拆分為“電話1”“電話2”等單獨的列。無重復數(shù)據(jù)項1NF的定義若一個表中所有列是不可再分的數(shù)據(jù)項(原子項),就稱這樣的設計屬于或服從第一范式。0102消除數(shù)據(jù)冗余通過將復合字段拆分為多個獨立字段,減少數(shù)據(jù)冗余,提高數(shù)據(jù)存儲效率。例如,將學生成績表中的“成績”字段拆分為多門課程的成績,避免了成績信息的重復存儲。提高數(shù)據(jù)一致性確保每個字段的值是唯一的,避免重復數(shù)據(jù)帶來的更新和維護問題。例如,學生信息表中,將多個電話號碼拆分為單獨的字段后,更新電話號碼時只需修改對應的字段,不會影響其他字段。1NF的應用03第二范式(2NF)2NF的定義完全函數(shù)依賴在1NF基礎上,表中的每一個非主屬性必須完全函數(shù)依賴于候選碼,不能部分依賴于候選碼。例如,購物單表中,非主屬性“銷售日期”和“收銀員”不能部分依賴于主碼(單據(jù)號,序號),而應完全依賴于主碼。消除部分依賴通過分解表,將部分依賴的非主屬性分離到新的表中,消除部分依賴帶來的數(shù)據(jù)冗余。例如,將購物單表分解為“銷售單據(jù)表”和“商品明細表”,消除“銷售日期”和“收銀員”對主碼的部分依賴。2NF的定義表的每一個非主屬性列均完全函數(shù)依賴于任一候選碼,這樣的設計屬于第二范式。2NF的定義通過分解表,減少重復數(shù)據(jù),提高存儲效率。例如,分解后的購物單表中,每個單據(jù)的“銷售日期”和“收銀員”信息只存儲一次,避免了重復存儲。分解后的表結(jié)構(gòu)更清晰,查詢時只需訪問相關(guān)的表,減少了查詢范圍,提高了查詢效率。例如,查詢某個單據(jù)的銷售日期時,只需訪問“銷售單據(jù)表”,而無需遍歷整個購物單表。提高查詢效率消除數(shù)據(jù)冗余2NF的應用04第三范式(3NF)3NF的定義如果表中不存在非主屬性列傳遞函數(shù)依賴于任一候選碼,這樣的設計就屬于或服從第三范式。傳遞函數(shù)依賴在2NF基礎上,表中不存在非主屬性對候選碼的傳遞函數(shù)依賴。例如,學生信息表中,“班主任”不能通過“專業(yè)”或“班級”傳遞依賴于主碼“序號”,而應直接依賴于主碼。消除傳遞依賴通過分解表,將傳遞依賴的非主屬性分離到新的表中,消除傳遞依賴帶來的數(shù)據(jù)冗余。例如,將學生信息表分解為“學生表”和“專業(yè)班級表”,消除“班主任”對主碼的傳遞依賴。01023NF的定義3NF的定義通過分解表,減少重復數(shù)據(jù),提高存儲效率。例如,分解后的學生信息表中,“班主任”信息只存儲一次,避免了重復存儲。消除數(shù)據(jù)冗余消除傳遞依賴后,更新數(shù)據(jù)時只需修改相關(guān)表中的少量記錄,減少了更新操作的復雜性和錯誤率。例如,更新“班主任”信息時,只需修改“專業(yè)班級表”中的記錄,而無需修改每個學生的記錄。提高數(shù)據(jù)一致性3NF的應用05BCNF(擴充的第三范式)BCNF的定義主屬性的依賴消除主屬性依賴在3NF基礎上,所有屬性(包括主屬性)都不部分或傳遞函數(shù)依賴于候選碼。例如,學生選課表中,“課程”不能通過“任課教師”傳遞依賴于候選碼(學號,任課教師),而應直接依賴于候選碼。通過分解表,將部分或傳遞依賴的主屬性分離到新的表中,消除主屬性依賴帶來的數(shù)據(jù)冗余。例如,將學生選課表分解為“學生選課表”和“課程教師表”,消除“課程”對候選碼的部分依賴。BCNF的定義BCNF消除了主屬性對候選碼的部分函數(shù)依賴和傳遞函數(shù)依賴。BCNF的定義通過分解表,減少重復數(shù)據(jù),提高存儲效率。例如,分解后的學生選課表中,“課程”信息只存儲一次,避免了重復存儲。消除數(shù)據(jù)冗余+消除主屬性依賴后,更新數(shù)據(jù)時只需修改相關(guān)表中的少量記錄,減少了更新操作的復雜性和錯誤率。例如,更新“課程”信息時,只需修改“課程教師表”中的記錄,而無需修改每個學生的記錄。提高數(shù)據(jù)一致性+BCNF的應用一個商場的商品分類:
商品分類 服裝 男裝 西裝 休閑裝 女裝 套裝 職業(yè)裝 休閑裝 童裝 電器 進口 國產(chǎn) 日用品2.3 實例分析:
2.3.1正確理解1NF-樹結(jié)點的數(shù)據(jù)表設計:代碼(主碼) 名稱 01 服裝 0101 男裝 010101 西裝 010102 休閑裝 0102 女裝 010201 套裝 010202 職業(yè)裝 010203 休閑裝 0103 童裝 02 電器 0201 進口 0202 國產(chǎn) 03 日用品 關(guān)系模型設計:冗余分析:在上述設計中增加“上級代碼”、“代碼級數(shù)”、“是否為葉結(jié)點”等列,顯然,這些列的數(shù)據(jù)為冗余數(shù)據(jù),因為這些數(shù)據(jù)值完全可以由“代碼”計算得到。這些列并不傳遞或部分依賴于碼似乎產(chǎn)生了一種既有數(shù)據(jù)冗余但又符合所有范式的模式分析代碼包含信息:“代碼”屬性不是原子項,它至少包含了下列兩個信息(所以不符合1NF):本級代碼上級代碼,而上級代碼又包含了上述兩個信息。1NF規(guī)范化:主要任務是把代碼項分解為原子項:思考一:把代碼分解成本級代碼和上級代碼兩項,由于上級代碼仍包含本級代碼和上級代碼,所以不是原子項。這個思路不可行思考二:由于“代碼”實際包含了一個樹結(jié)構(gòu)信息,參考數(shù)據(jù)結(jié)構(gòu)中方法,可以把代碼分解成下列原子項:
id: 流水號,主鍵 code: 本級代碼 pid: 父結(jié)點id對上述關(guān)系模型的分析:code name
id code
pid name
0 001 服裝 1 01 0 服裝0101 男裝 2 01 1 男裝010101 西裝 3 01 2 西裝010102 休閑裝 4 02 2 休閑裝0102 女裝 5 02 1 女裝010201 套裝 6 01 5 套裝010202 職業(yè)裝 7 02 5 職業(yè)裝010203 休閑裝 8 03 5 休閑裝0103 童裝 9 03 1 童裝02 電器 10 02 0 電器0201 進口 11 01 10 進口0202 國產(chǎn) 12 02 10 國產(chǎn)03 日用品 13 03 0 日用品為以后算法實現(xiàn)的方便,左邊設計第一行為根結(jié)點,并且code類型必須使用varchar避免空格。以下假設上列數(shù)據(jù)對應兩個表:classes_1和classes_2。兩種設計的數(shù)據(jù)存儲:兩種設計的比較:范式的意義兩種設計的可行性:原始設計中關(guān)系雖然不符合1NF,但此設計中代碼包含了分類樹的所有結(jié)構(gòu)信息,所以設計方案是可行的。規(guī)范后的設計通過pid建立結(jié)點的父子關(guān)系同樣包含了樹的所有結(jié)構(gòu)信息,所以也是可行的。比較方法:從冗余、擴展能力及空間利用率、結(jié)點引用和各種算法四個方面進行比較一)冗余每一個結(jié)點只需要知道其父結(jié)點代碼,就可以構(gòu)建一棵樹,而根據(jù)第一種設計,其每一個結(jié)點均包含了其所有祖先的結(jié)點代碼,這就是冗余的信息。設計一冗余的信息被隱藏在一個列中,并且隨樹結(jié)構(gòu)層數(shù)的增加而增加設計二沒有冗余二)擴展能力及空間利用率
第一種設計表示的樹結(jié)點的層數(shù)受code列長度的限制,而第二種設計則沒有這種限制。為了能適應結(jié)點層數(shù)的擴展,第一種設計不得不加大code列的長度,由于code列為主碼,從效率角度考慮,通常其數(shù)據(jù)類型會首先考慮使用char型,所以在實際的代碼后會存在大量的空格。在每一級代碼長度不一樣的情況下,第二種設計的code列同樣會產(chǎn)生少量的空格,但由于code列不是主碼,可以把其類型定義為varchar解決這個問題。
三)結(jié)點的引用
第一種設計若直接選擇code列主碼,則一旦代碼進行修改,通過外鍵引用該表的關(guān)系也要做修改。第二種設計由于其他關(guān)系通過id列引用該表,所以當code列修改后,通過外鍵引用該表的關(guān)系無需做修改。作為外碼,引用第二種設計的id對空間的占用比引用第一種設計code對空間占用要小。設計一也可人為地增加一個主碼,但客觀上又造成新的空間占用。
四)算法比較
1)
規(guī)范化設計較非規(guī)范化設計簡單的算法:對某個結(jié)點是否為葉結(jié)點的判斷通過判斷select結(jié)果是否為空,第一種設計select的where條件較復雜獲取所有葉結(jié)點都需要使用子查詢,但設計一子查詢中要引用主查詢中的列獲取某個結(jié)點從根結(jié)點開始的完整路徑都可以使用select獲得,但設計一更復雜2)規(guī)范化設計與非規(guī)范化設計復雜性相近的算法
結(jié)點的遷移、復制和交換例1:把0101下的所有結(jié)點復制到0102的結(jié)點下結(jié)點的增加、刪除和修改逐級求和的實現(xiàn)例2:逐級求和的演示
例1:把0101下的所有結(jié)點復制到0102的結(jié)點下code name
id code
pid name
0 001 服裝 1 01 0 服裝0101 男裝 2 01 1 男裝010101 西裝 3 01 2 西裝01010101全毛 4 01 3 全毛01010102化纖 5 02 3 化纖010102 休閑裝 6 02 2 休閑裝0102 女裝 7 02 1 女裝010201 套裝 8 01 7 套裝010202 職業(yè)裝 9 02 7 職業(yè)裝010203 休閑裝
10
03
7
西裝010204西裝
11 04 7 休閑裝01020401全毛 12 01 11 全毛01020402化纖 13 02 11 化纖010205休閑裝 14 05 7 休閑裝code amt
id code
pid amt
0 001 900 1 01 0 9000101 300 2 01 1 300010101 100 3 01 2 100010102 200 4 02 2 200 0102 390 5 02 1 390010201 120 6 01 5 120010202 130 7 02 5 130010203 140 8 03 5 1400103 210 9 03 1 21002 290 10 02 0 2900201 140 11 01 10 1400202 150 12 02 10 15003 300 13 03 0 300例2:各結(jié)點包含數(shù)量的逐級求和3)規(guī)范化設計劣于非規(guī)范化設計的算法
取某結(jié)點的所有子結(jié)點獲取結(jié)點所在層數(shù)某級代碼長度加長獲得結(jié)點在設計一中的code 注:可以在第二種設計中增加一個level列表示一個結(jié)點所在的層數(shù),這樣可以使第1到第3個算法變得和非規(guī)范化設計一樣簡單
例3:一些算法的實現(xiàn)或思路設計一:判定code=codev結(jié)點是葉結(jié)點 select*fromclasses_1wherecodelikecodev+’%’andlen(code)>len(codev)為空集。設計二:判定id=idv結(jié)點是葉結(jié)點 select*fromclasses_2wherepid=idv為空集。設計一:取出所有葉結(jié)點 select*fromclasses_1awherenotexists (select*fromclasses_1wherecodelikertrim(a.code)+'%'andlen(rtrim(code))>len(rtrim(a.code)))設計二:取出所有葉結(jié)點 即獲取id不出現(xiàn)在父結(jié)點集中的結(jié)點全體父結(jié)點集的id:selectpidfromclasses_2wherepidisnotnull所有葉結(jié)點:select*fromclasses_2whereidnotin(selectpidfromclasses_2wherepidisnotnull)設計二:獲得結(jié)點路徑 selectisnull(,'')+'/'+isnull(,'')+'/'+isnull(,'')fromclasses_2a,classes_2b,classes_2cwherec.pid=b.idandb.pid=a.id表達式中有部分值為null,則整個表達式值為null,有些DBMS會把null處理為空串。該語句對最大級數(shù)為1,2,3均適用,若級數(shù)大于3,上述語句可作相應擴展。設計一算法:取代碼為codev結(jié)點的所有子結(jié)點 select*fromclasses_1wherecodelikecodev+”%”設計二算法:取id=idv結(jié)點的所有子結(jié)點 select*fromclasses_2wherepid=idvorpidin(selectidfromclasses_2wherepid=idv)結(jié)點的遷移、復制和交換例:把男裝下所有子結(jié)點(西裝和休閑裝)復制到女裝下。算法:掃描要復制的節(jié)點的所有子結(jié)點對第一層子結(jié)點,依次產(chǎn)生新的代碼:(010101->010203,010102->010204),對非第一層子結(jié)點(如01010101):設計一:則代碼為上一層新增的代碼(010203)+要復制的最后一級代碼(01)。設計二:復制被復制代碼(01),pid為上級代碼的id復制前:01 服裝0101 男裝010101 西裝01010101 全毛01010102 化纖010102 休閑裝0102 女裝010201 套裝010202 職業(yè)裝復制后:01 服裝0101 男裝010101 西裝01010101 全毛01010102 化纖010102 休閑裝0102 女裝010201 套裝010202 職業(yè)裝010203 西裝01020301 全毛01020302 化纖010204 休閑裝設計一:由代碼總長得到代碼級數(shù)設計二:比較困難,循環(huán)搜索父結(jié)點,直到根結(jié)點,所以n級代碼要對整表掃描n次后才能獲得其級數(shù)n。
vlev=1;vid=當前結(jié)點id;vpid=當前結(jié)點pid; while(vpid!=0)//有父結(jié)點 { 整表掃描找到當前結(jié)點的父結(jié)點(id=vpid的行): vid=id;vpid=pid; vlev=vlev+1; } returnvlev某級代碼長度加長基本方法是對存在的某級代碼全部左補“0”設計一:若分級代碼被其他關(guān)系外鍵引用,除容易產(chǎn)生更新異常外,對代碼表本身的修改簡單。設計二:關(guān)鍵是怎樣獲得所有某級別的代碼,然后左補“0”,也就是本問題的解決依賴于上一問題的解決??梢栽诒碇性黾印凹墧?shù)”(level)字段解決規(guī)范化設計的這一缺陷,具體設計和分析見2.4中行間冗余的例1分級代碼的還原(用到了根結(jié)點)設計一:直接取code設計二:selectisnull(a.code,'')+isnull(b.code,'')+isnull(c.code,'')fromclasses_2a,classes_2b,classes_2cwherec.pid=b.idandb.pid=a.idorderby1;code類型必須使用varchar避免空格,該語句對最大級數(shù)為1,2,3均適用)一般不符合范式就會有數(shù)據(jù)冗余,上例并不是例外,因為“代碼”列本身存在冗余,如所有“0101”的子結(jié)點均重復包含了其上級代碼“0101”。不屬于某個范式甚至是1NF的關(guān)系設計不一定就是一個不好的設計,但如果使它規(guī)范化,那可能是一個更好的設計。一個看上去比較復雜的設計,并不一定會給以后的實現(xiàn)帶來更多的復雜性。結(jié)論:2.3.2 3NF在實踐中應用問題一)問題提出引用數(shù)據(jù)發(fā)生變更的處理:例1:系名問題:學校系名變更,要求學生各時期的系名仍使用當時的系名。一個學生在就學期間可能對應多個系名。例2:供應商問題:商品的供應商名稱發(fā)生變更,要求變更前進貨單中的供應商仍保留原來名稱。與系名問題不同的是一個進貨單只可能對應一個供應商名。上述兩種情況,若在學生關(guān)系或商品關(guān)系中僅以系編號或供應商編號引用系信息或供應商信息,符合3NF,但一旦對應信息發(fā)生變更(如供應商名稱),原信息被覆蓋(丟失)。二)供應商問題的常見解決方案方案:把可能變更的且要保留的引用數(shù)據(jù)放入引用表中,如把供應商編號和進貨時的供應商名稱同時存入進貨單中。分析(是否符合范式):(后者認識上有誤區(qū))1)若不發(fā)生系供應商名稱變更,則由于存在傳遞依賴“進貨單號供應商號供應商名稱”,上述設計不符合3NF。2)誤區(qū):當供應商名稱發(fā)生變更,由于進貨單中存放的是進貨時供應商名,所以(1)中傳遞依賴不再成立,所以符合3NF。3)正確的判斷:若供應商名發(fā)生變更,事實上成立傳遞依賴:“進貨單號(供應商號,進貨日期)供應商進貨時名稱”,所以關(guān)系仍不符合了3NF。冗余分析:存在兩個方面的冗余對引用信息變更部分:變更前的信息重復(下例中的紅色部分)對引用信息未變更部分:若引用信息發(fā)生變更的頻率極低,顯然增加的列對大多數(shù)引用信息未發(fā)生變更的情況是純粹的冗余。(下例中綠色部分)*供應商編號供應商名稱 …A00011 海爾冰箱廠A00012 長虹電器有限公司A00013 益民食品廠A00012原名長虹電器廠
*進貨單號 供應商編號供應商名稱 …D001 A00011 海爾冰箱廠D002 A00011 海爾冰箱廠D003 A00012 長虹電器廠D004 A00012 長虹電器廠D005 A00011 海爾冰箱廠D006 A00012 長虹電器廠D007 A00012 長虹電器有限公司三)符合范式的解決方案目標:使設計符合所有范式要求?;痉椒ǎ菏褂霉瘫砗凸堂Q變更表記錄供應商所有曾用名。1)方案一:關(guān)系模型設計:供應商(*供應商編號,供應商當前名稱,……)供應商名稱變更表(*供應商編號,*名稱版本號,變更日期,供應商原名稱)進貨單摘要(*單號,日期,供應商編號,名稱版本號,……)模型設計說明:變更表記錄供應商的原名稱,而新名稱總是存放在供應商表中。供應商名稱變更表合理假設同一天供應商名稱不會變更兩次,所以可以以(日期,供應商編號)為碼。但考慮到引用的便捷性,加入一個版本號(流水號,對每一個供應商從1開始,每變更一次加1)。概要設計:新增進貨單:僅引用供應商表,名稱版本號取0供應商名稱變更:(供應商信息維護的一個部分)(1)名稱變更:供應商名稱變更表新增一行,版本號為上一變更版本號+1(2)更新當前供應商名稱:以新供應商名稱替換供應商表中供應商名稱。(3)更改進貨單對供應商名稱的引用:所有該供應商且供應商名稱版本號=0的進貨單,其供應商名稱版本號?。?)中產(chǎn)生的版本號。查詢進貨單(含供應商):若供應商名稱版本號=0,則供應商名稱引用供應商表,否則引用供應商名稱變更表。(練習select)設計特點:符合所有范式若原系統(tǒng)設計沒有考慮供應商名稱變更問題,此設計對原設計影響較小。供應商名稱變更較少發(fā)生的情況下,本設計對系統(tǒng)的性能(查詢效率)基本無影響。2)方案二:關(guān)系模型設計:供應商(*供應商編號,地址,電話,……)供應商名稱變更表(*供應商編號,*供應商名稱版本號,名稱設定日期,供應商名稱)進貨單(*單號,日期,供應商編號,版本號,…)模型設計說明供應商名稱全部放在“供應商名稱變更表”概要設計:新增進貨單:僅引用供應商變更表中名稱版本號最大的行。(練習select)供應商名稱變更:(包括供應商信息維護)新增供應商或名稱變更:供應商名稱變更表新增一行,版本號從0開始,或為上一變更版本號+1查詢進貨單(含供應商):全部通過供應商編號和名稱版本號引用供應商名稱變更表。設計特點:符合所有范式若原系統(tǒng)設計沒有考慮供應商名稱變更問題,此設計對原設計影響較大。實現(xiàn)較方案一簡單若進貨單查詢中要包括供應商的其他信息,不論供應商名稱是否發(fā)生過變更,都要連接供應商表和供應商名稱變更表,較方案一多連接一個表。3)方案三關(guān)系模型設計:供應商名稱變更表(*供應商編號,*供應商信息版本號,設定日期,供應商名稱,電話,地址,…)進貨單(*單號,日期,供應商編號,版本號,…)模型設計說明:供應商的所有屬性均放在“供應商名稱變更表”中。設計特點:較方案二的特點是去掉供應商表,把供應商信息全部放到變更表中,一但供應商名稱變化,該供應商其他信息要復制一遍,是缺點,但也是優(yōu)點,即具有了變更供應商其他屬性的能力,對信息變更不常發(fā)生的情況下,重復的數(shù)據(jù)量很小。適合名稱變化少量發(fā)生的情況。思考和練習:分析是否符合NF,進行概要設計。四)系名問題記錄變更:系名的變更的記錄方法可類似地采用供應商名稱變更的方案1-3的處理方法。引用問題:一個進貨單與供應商名稱為1-1關(guān)系,可以用(供應商編號,供應商名稱版本號)引用供應商名,但學生在讀期間,系名可能發(fā)生多次變更,所以學生對系名可能為1-多關(guān)系系名信息不可能保存在學生表中通過學生中系編號將引用到系名變更表中多個系名例:有下列兩個表:department*設置日期*系編號系名稱1998-2-1B001數(shù)學系1998-2-1B002物理系1998-2-1C001計算機系1999-5-1C001軟件學院2000-6-10C001信息學院students*學號 姓名 系編號98101 王海 C00198102 李明 C00198201 周濤 B00198202 吳名 B00198301 孫新 B002完成下列select語句:獲得各系的最新系名由于要輸出學號為98101的學生1999-7-1的成績單,如何獲得當時的該學生所在系名?獲得各系的最新系名:語句一:使用max聚集函數(shù) selectdeptid,deptnamefromdepartmenta wheresetdate=(selectmax(setdate)fromdepartmentwheredeptid=a.deptidgroupbydeptid)語句二:使用all操作符 selectdeptid,deptnamefromdepartmenta wheresetdate>=all(selectsetdatefromdepartmentwheredeptid=a.deptid)獲得1999-7-1學生98101所在系名:關(guān)鍵點:獲得1999-7-1日前的最后一次設置的所有系名,實際在上例語句一子查詢中加條件setdate<=‘1999-7-1’即可:
selectdeptnamefromdepartmentawheresetdate=(selectmax(setdate)fromdepartmentwheredeptid=a.deptidandsetdate<='1999-7-1'groupbydeptid)在上述查詢中限制為98101學生所在系:
selectdeptnamefromdepartmenta wheresetdate=(selectmax(setdate)fromdepartmentwheredeptid=a.deptidandsetdate<=‘1999-7-1’groupbydeptid) --紅色部分語句同上 anddeptidin(selectdeptidfromstudentswhereid='98101')思考和練習:使用all查詢1999-7-1所有系名在子查詢中加條件:將出現(xiàn)1999-7-1后設置的系名“信息學院”: selectdeptid,deptnamefromdepartmenta wheresetdate>=all(selectsetdatefromdepartmentwheredeptid=a.deptidandsetdate<'1999-7-1')在主查詢中加條件:系號為C001最后的設置日期大于1999-7-1,所以該系名不出現(xiàn): selectdeptid,deptnamefromdepartmenta wheresetdate>=all(selectsetdatefromdepartmentwheredeptid=a.deptid) andsetdate<='1999-7-1'正確的做法是在子查詢和主查詢中均加此條件。引用方法小結(jié):供應商問題中進貨單也可以用上述方法獲得供應商名稱,但由于查詢使用了子查詢(對包括供應商的進貨單的查詢將更復雜),當數(shù)據(jù)量很大時,效率明顯降低。所以建議使用版本號的引用方法。引用信息表達的是某一時刻的特征,如供應商問題中進貨單對供應商名稱的引用,可采用“編號+版本號”作為外鍵引用的方法得到名稱。引用信息表達的是某一時期的特征,如系名問題中學生信息引用各時期的系名,則必須結(jié)合日期用查詢語句得到該日期的系統(tǒng)。2.4 范式的局限-對冗余的進一步討論一)突破范式限制有時為了提高運行的時間效率需要突破范式限制。突破范式限制一定需要在空間上付出代價,以空間換時間。在下列情況下,我們需要考慮突破范式限制:被動優(yōu)化:當運行的響應時間要求很高時,而規(guī)范設計又達不到要求時主動優(yōu)化:較少的空間和算法代價換取了較大的速度提升(下面的例1)二)合理冗余
1)多表冗余范式無法去除多表冗余。多表冗余的必要性:多個關(guān)系之間的數(shù)據(jù)冗余的必要性要權(quán)衡空間,時間和安全性等各方面的考慮:出于安全性考慮的完全相同的數(shù)據(jù)表(熱備份)。出于計算時間(效率)上考慮的月結(jié)轉(zhuǎn)表(用單獨的表保存各月的累計數(shù),每月計算一次,作為下月的初始值,見下例2)。2)單表的行間冗余定義:所謂行間冗余指某行某列數(shù)據(jù)可由本行或其他行的數(shù)據(jù)計算得到。如存在子結(jié)點的樹結(jié)點的數(shù)據(jù)為對應下層子結(jié)點數(shù)據(jù)之和。行間冗余可能違反范式(下例1),也可能不違反范式(下例2),后者屬于范式無法排除的冗余。冗余必要性:通過與無冗余設計在性能、安全性和算法復雜性等方面比較后評價其必要性。冗余的代價:系統(tǒng)一般要提供冗余數(shù)據(jù)的生成程序及冗余數(shù)據(jù)正確性的檢測程序。例1:在2.3.1實例中增加結(jié)點在樹中的層數(shù)Level后是否符合范式?必要性:原設計要獲得第n層結(jié)點的層數(shù)n要對整表掃描n遍,當樹結(jié)點層次很深時,執(zhí)行效率低??尚行裕涸黾訉訑?shù)列l(wèi)evel,在結(jié)點加入時(總是在父結(jié)點已知的情況下)為其賦值,其值level=父結(jié)點level+1。改進后優(yōu)點:以簡單的level維護算法取代了相
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 導游業(yè)務知識培訓課件
- 導播基礎知識培訓總結(jié)
- 慢性病常見疾病知識
- 養(yǎng)殖企業(yè)防火措施方案(3篇)
- 暗渠排水應急預案方案(3篇)
- 會員業(yè)務體系建設方案(3篇)
- 個人飲食編制方案(3篇)
- 廣西奶茶加盟方案(3篇)
- 獻血站設計方案(3篇)
- 一季度安全知識培訓方案課件
- 急診清創(chuàng)縫合術(shù)
- 護理深靜脈血栓科普
- 寄宿學校班主任培訓課件
- 服務理念與服務意識培訓
- ASTM-D3359-(附著力測試標準)-中文版
- 保險公司與定點醫(yī)院合作協(xié)議書(2篇)
- 商業(yè)銀行聲譽風險應對及實踐案例精講課件
- 特種設備日管控、周排查、月調(diào)度管理制度
- 2024年縣鄉(xiāng)教師選調(diào)進城考試《教育學》題庫及完整答案(全優(yōu))
- 2023年HSE法律法規(guī)清單
- 糖尿病運動療法講座醫(yī)學課件
評論
0/150
提交評論