版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、(第一課)數(shù)據(jù)庫(kù)的存放格式是堆文件從層次型數(shù)據(jù)庫(kù)轉(zhuǎn)變?yōu)殛P(guān)系型數(shù)據(jù)庫(kù),基于資源管理器的樹(shù)狀結(jié)構(gòu)的組織沒(méi)辦法科學(xué)化。基于層次結(jié)構(gòu)的組織方式不能抽象成科學(xué)化的方法,而關(guān)系型可以使得數(shù)據(jù)庫(kù)的組織簡(jiǎn)明而合理。將樹(shù)狀結(jié)構(gòu)放入關(guān)系型數(shù)據(jù)庫(kù)中在大數(shù)據(jù)量的情況下如何提高性能:表設(shè)計(jì)、模式設(shè)計(jì),SQL優(yōu)化等方法。環(huán)境為基于硬盤(pán)上的關(guān)系數(shù)據(jù)庫(kù)(SIP是將數(shù)據(jù)庫(kù)放入內(nèi)存中,提高數(shù)據(jù)庫(kù)數(shù)據(jù)分析的效率。在之后十年中,大數(shù)據(jù)量的分析都會(huì)放入memory中進(jìn)行)數(shù)據(jù)庫(kù)之間的比較,比如Oracle/MySQL/SQL Server/DB2,數(shù)據(jù)庫(kù)的連接、組織形式是完全不同的。要提高數(shù)據(jù)庫(kù)的性能最本質(zhì)的是在某一個(gè)數(shù)據(jù)庫(kù)上提高性能
2、在基于web的應(yīng)用中大量地使用非關(guān)系型數(shù)據(jù)庫(kù),放寬對(duì)一致性的要求而提高吞吐量。因?yàn)橄到y(tǒng)有并發(fā)的限制,所以單一請(qǐng)求的性能作為系統(tǒng)的性能指標(biāo)是不可行的,因此引入吞吐量的概念。計(jì)算機(jī)系統(tǒng)中,最大的瓶頸是總線級(jí)的傳輸效率,但是在軟件中瓶頸可能會(huì)在任何位置。一致性的要求會(huì)產(chǎn)生大量的回滾操作,從而降低吞吐量。NoSQL認(rèn)為臟寫(xiě)、不一致性都是可以接受的,只要在一段時(shí)間內(nèi)保證數(shù)據(jù)庫(kù)的一致性即可(關(guān)系型數(shù)據(jù)庫(kù)要求實(shí)時(shí)保證數(shù)據(jù)庫(kù)的一致性)。Google、新浪微博等都是使用NoSQL實(shí)現(xiàn)的推薦教材見(jiàn)PDF關(guān)系代數(shù):同樣的代數(shù)表達(dá)式,所有的操作都是關(guān)系和操作符之間的操作,改變代數(shù)的形式而不改變最終的結(jié)果。每一個(gè)表達(dá)式
3、都是一個(gè)SQL想要得到的結(jié)果集的表達(dá)式,where是選擇操作,select是投影操作。表達(dá)式可以轉(zhuǎn)換成多種具有相同結(jié)果的不同表達(dá)式,每一個(gè)表達(dá)式都被稱為完成某一個(gè)結(jié)果的某一條路徑,從中選出一條最省的路徑(運(yùn)算的時(shí)間、中間結(jié)果的存儲(chǔ)空間),由查詢優(yōu)化器根據(jù)關(guān)系代數(shù)來(lái)尋找最快路徑計(jì)算機(jī)對(duì)于表達(dá)式的變換是有約束的,所以可以找到一個(gè)有限的變換集,尋找一個(gè)性能最好的表達(dá)式從而形成一個(gè)查詢。但是計(jì)算查詢優(yōu)化的耗時(shí)不能過(guò)長(zhǎng)完整性約束:組件約束,引用約束視圖:是一個(gè)SQL語(yǔ)句,當(dāng)使用到SQL語(yǔ)句進(jìn)行查詢的時(shí)候才生成這個(gè)視圖,在用的時(shí)候才會(huì)被執(zhí)行。視圖用在:權(quán)限:當(dāng)希望基本表不暴露給別人,所以使用視圖來(lái)暴露給別
4、人,此時(shí)視圖可能引用到多張表而形成一個(gè)可以被其他應(yīng)用所看到和使用的視圖,從而保護(hù)基本表不被別人看到。與接口類(lèi)似重構(gòu):用在數(shù)據(jù)庫(kù)重構(gòu)中。完成了數(shù)據(jù)庫(kù)重構(gòu)中,而將原來(lái)的表做成完全一樣的視圖,此時(shí)內(nèi)部的所有重構(gòu)都不會(huì)影響到外部的使用(外部應(yīng)用使用視圖)。如果視圖引用到大于4張表,此時(shí)應(yīng)當(dāng)考慮到性能的問(wèn)題,但是應(yīng)用不會(huì)看到視圖的引用情況,所以使用視圖可能會(huì)掩蓋一些現(xiàn)象事務(wù)處理:需要有時(shí)間戳的概念(為了避免臟讀),出現(xiàn)臟讀需要回滾,但是Oracle不回滾而DB2和SQL Server都會(huì)回滾。Oracle稱其為一致性讀。NULL值就是不知道它是什么值的一個(gè)值,但是SQL Server認(rèn)為空值是一個(gè)值。這
5、些問(wèn)題會(huì)導(dǎo)致數(shù)據(jù)庫(kù)移植變得十分困難復(fù)雜事情:數(shù)據(jù)庫(kù)遷移;數(shù)據(jù)庫(kù)重構(gòu)SQL:SQL的復(fù)雜度取決于from后面包含的表數(shù)量(笛卡爾積的基數(shù))。沒(méi)有任何廠商支持完整的SQL99標(biāo)準(zhǔn),而是只支持最基本的部分(query table/ query view/ select/ insert/ update/ delete)。每一個(gè)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程和觸發(fā)器都不一樣范式(使用范式來(lái)降低數(shù)據(jù)庫(kù)設(shè)計(jì)產(chǎn)生的冗余,有冗余則導(dǎo)致維護(hù)數(shù)據(jù)庫(kù)會(huì)帶來(lái)更多的操作。有時(shí)可能會(huì)打破范式形成一定的冗余,為了提高數(shù)據(jù)庫(kù)的性能,逆范式和反范式只有幾種方式)1范式(字段都是原子型單值,只被當(dāng)成一個(gè)值來(lái)使用,這個(gè)值不做拆分進(jìn)行驗(yàn)證)3范式(
6、沒(méi)有函數(shù)依賴,身份證、性別、生日三個(gè)字段都存在的話,則不滿足第三范式,因?yàn)檫@些字段之間有函數(shù)依賴)(第二課)任何DBMS都可以支持三千個(gè)并發(fā)連接,超過(guò)三千個(gè)連接則需要使用其他方式來(lái)改善并發(fā)的性能。而理論上應(yīng)用的并發(fā)數(shù)量無(wú)窮大并發(fā)修改針對(duì)的是數(shù)據(jù)庫(kù)上的某一個(gè)獨(dú)立資源。三千個(gè)并發(fā)連接可以并行使用同一個(gè)數(shù)據(jù)庫(kù),但是不能同時(shí)修改其中的一個(gè)資源,即對(duì)資源的修改是串行的(為了保證數(shù)據(jù)庫(kù)的一致性)。這個(gè)資源稱為原子資源,page/block是數(shù)據(jù)讀取的最小單位。DBMS從硬盤(pán)中讀取數(shù)據(jù)不是按記錄讀取的,而是按塊(讀取完整的、固定大小的數(shù)據(jù)塊,當(dāng)中包含多條記錄)讀取,而后修改其中一條記錄Oracle允許臟讀,
7、而NoSQL則不考慮數(shù)據(jù)的一致性性能在數(shù)據(jù)庫(kù)中非常重要。性能可度量,它的可度量的性能指標(biāo)是吞吐量。性能在設(shè)計(jì)之前需要被測(cè)試(SQL的寫(xiě)法、索引、文件存儲(chǔ)方式、表結(jié)構(gòu)的設(shè)計(jì)都可以影響數(shù)據(jù)庫(kù)的性能,其中表結(jié)構(gòu)的設(shè)計(jì)涉及到范式、反范式、逆范式)。數(shù)據(jù)庫(kù)的設(shè)計(jì)結(jié)果中,邏輯設(shè)計(jì)是表結(jié)構(gòu),物理設(shè)計(jì)是索引和物理組織形式缺省的索引結(jié)構(gòu)為B樹(shù)索引,而oracle中的索引結(jié)構(gòu)為位圖索引。位圖索引對(duì)于低頻字段(可取值的范圍小)可以大幅提高存取效率,當(dāng)位圖索引的索引鍵進(jìn)行切換修改的時(shí)候(N-Y),切換過(guò)程中與N相關(guān)的字段都會(huì)被鎖住每一個(gè)SQL的查詢都有很多查詢路徑,但是不能遍歷所有的路徑,所以必須要設(shè)置一個(gè)timeo
8、ut時(shí)間段DBA的職責(zé):系統(tǒng)數(shù)據(jù)備份,系統(tǒng)數(shù)據(jù)恢復(fù)(恢復(fù)備份的數(shù)據(jù))。開(kāi)發(fā)人員則需要做配置工作,比如表設(shè)計(jì)、觸發(fā)器、視圖、索引設(shè)計(jì)、緩沖區(qū)大小設(shè)計(jì)等。普遍認(rèn)為,索引以下的更底層的任務(wù)由DBA完成對(duì)于樹(shù)結(jié)構(gòu),oracle中使用with關(guān)鍵字實(shí)現(xiàn)遞歸,或者使用connect by start with來(lái)實(shí)現(xiàn)自頂向下或者自底向上的查詢二維表就是關(guān)系,關(guān)系操作是表和表之間的操作。關(guān)系不包含重復(fù)的數(shù)據(jù),但是DBMS中并未這樣實(shí)現(xiàn);關(guān)系的記錄之間沒(méi)有順序,如果數(shù)據(jù)之間有次序要求,則不能被稱為一張關(guān)系表,而記錄的順序往往會(huì)影響查詢的效率數(shù)據(jù)庫(kù)中不存在Yes/No或者True/False這樣的字段業(yè)務(wù)的約束可
9、以放在程序中檢查,也可以放在數(shù)據(jù)庫(kù)中比如:使用check關(guān)鍵字定義數(shù)據(jù)的取值范圍,對(duì)字段的有效性進(jìn)行檢查;而購(gòu)買(mǎi)操作可能包含多條數(shù)據(jù)庫(kù)操作,比如庫(kù)存減一、配送單加一,可以把它們作為一個(gè)業(yè)務(wù)邏輯“購(gòu)買(mǎi)”,也可以放在程序中操作。如果數(shù)據(jù)庫(kù)是一個(gè)中心級(jí)數(shù)據(jù)庫(kù),有多個(gè)應(yīng)用對(duì)數(shù)據(jù)庫(kù)訪問(wèn),將業(yè)務(wù)邏輯放在數(shù)據(jù)庫(kù)中可以使得該業(yè)務(wù)邏輯被多個(gè)應(yīng)用共享,業(yè)務(wù)邏輯發(fā)生變化時(shí)只需要修改一個(gè)業(yè)務(wù)邏輯;而某一個(gè)字段的取值范圍也應(yīng)當(dāng)放入數(shù)據(jù)庫(kù)中限制當(dāng)有多值字段時(shí)(比如一個(gè)產(chǎn)品有多個(gè)歷史價(jià)格),則滿足范式的做法是再使用一個(gè)新的數(shù)據(jù)表,當(dāng)中存儲(chǔ)產(chǎn)品ID和產(chǎn)品價(jià)格。這樣做的話會(huì)導(dǎo)致需要查詢多個(gè)數(shù)據(jù)表在架構(gòu)層面上解決數(shù)據(jù)庫(kù)性能問(wèn)題:
10、將耗時(shí)間的數(shù)據(jù)庫(kù)操作放在不密集的環(huán)境當(dāng)中。比如所有的銀行跨行清算都是批處理模式,而這種清算都是在深夜進(jìn)行同步操作:存取金額都是同步操作,必須要實(shí)時(shí)處理的業(yè)務(wù)異步操作:銀行清算屬于異步操作。異步處理方式處理很多不必要實(shí)時(shí)處理的業(yè)務(wù),從而提高數(shù)據(jù)庫(kù)性能處理數(shù)據(jù)庫(kù)的方式同步和異步集中和分布式(第四課)避免在select后使用*和distinct,因?yàn)榧词褂兄貜?fù)行,也可以在程序中進(jìn)行處理,但是如果直接用distinct處理可能會(huì)導(dǎo)致產(chǎn)生錯(cuò)誤的結(jié)果普通查詢的過(guò)程:先做from,再做select,再做wheredistinct - exists如果通過(guò)不同的SQL寫(xiě)法來(lái)完成必須去掉重復(fù)行這一約束?使用ex
11、ists關(guān)鍵字解決distinct的問(wèn)題,需要用到嵌套查詢。exists嵌套被稱為關(guān)聯(lián)嵌套,在子查詢中需要用到外層插敘的表,所以子查詢不能單獨(dú)運(yùn)行。一般而言是檢查外部查詢的每一行數(shù)據(jù)(針對(duì)外層查詢的每一個(gè)記錄),代入到子查詢中作為子查詢的條件。exists后的查詢只要不為空,則條件值為true。exists查詢應(yīng)用于某一條件在結(jié)果集中所占比例較小的情況,在這種情況下使用exists查詢能大幅度提高查詢效率,因?yàn)閳?zhí)行次數(shù)少(子查詢找到第一個(gè)結(jié)果就可以返回)。如果某一條件所占比重較大,則可以使用關(guān)鍵字in的嵌套查詢外層查詢所用到的字段的條件所對(duì)應(yīng)的內(nèi)層查詢的字段一定要在表中加上索引,這樣才能提高內(nèi)
12、部查詢的執(zhí)行效率內(nèi)部查詢并不需要計(jì)算查詢結(jié)果集,只判斷是不是有滿足內(nèi)部查詢的結(jié)果,換句話說(shuō),內(nèi)部查詢并不一定將查詢執(zhí)行完畢,可能在找到第一條滿足條件的數(shù)據(jù)后就完成執(zhí)行。故而,子查詢的計(jì)算時(shí)間難以估算使用exists暗示查詢優(yōu)化器,這個(gè)查詢的查詢計(jì)劃是:內(nèi)部查詢的查詢優(yōu)化,內(nèi)部查詢的優(yōu)化是隨機(jī)方式,內(nèi)部進(jìn)行獨(dú)立的優(yōu)化;內(nèi)部查詢是單表查詢,難以優(yōu)化exists查詢的好處內(nèi)部查詢優(yōu)化完畢之后不會(huì)被完整執(zhí)行內(nèi)部查詢中的join關(guān)系與外部查詢的表沒(méi)有直接的叉乘關(guān)系,而是代入外部查詢的結(jié)果值到內(nèi)部查詢中。這樣做減少了一次叉乘的過(guò)程,但是導(dǎo)致內(nèi)部查詢要被代入多次避免了distinct所帶來(lái)的結(jié)果集錯(cuò)誤的問(wèn)題
13、,因?yàn)樗钪饕墓ぷ魇菍?duì)外部查詢中的表格做選擇,而不是對(duì)join后的表格做選擇exists和in的區(qū)別exists被優(yōu)化一次后執(zhí)行多次,但是每一次都不一定要執(zhí)行完。由于在查詢優(yōu)化器中,優(yōu)化的時(shí)間遠(yuǎn)遠(yuǎn)超過(guò)執(zhí)行的時(shí)間,所以exists雖然需要執(zhí)行多次,但是它的效率可能反而較高。執(zhí)行exists要求外部條件所占比重小,這樣能刪掉大部分的外部查詢結(jié)果,故而子查詢的執(zhí)行次數(shù)少in被優(yōu)化一次后只需要執(zhí)行一次,但是必須是完整的執(zhí)行,然后再與外部查詢的結(jié)果比較找到交集。如果外層查詢的條件所占比例較大的話,則in的查詢效率都會(huì)遠(yuǎn)遠(yuǎn)超過(guò)exists使用查詢計(jì)劃告訴DBMS的查詢工作一個(gè)訂單有多個(gè)狀態(tài)的話,根據(jù)三范
14、式的要求,必須將訂單狀態(tài)放在另一個(gè)表中,將訂單號(hào)作為該表的外鍵,與狀態(tài)一起作為該表的主鍵在訂單和客戶的例子中(PDF27頁(yè)),orderstatus被使用多次,通過(guò)查詢的寫(xiě)法減少它的遍歷次數(shù)可以優(yōu)化查詢的過(guò)程??梢詫蓚€(gè)子查詢結(jié)合在一起,找到最后的狀態(tài)并判斷它是不是完成狀態(tài)。解決的方法是,將查詢每一個(gè)訂單的最后結(jié)果的子查詢的結(jié)果關(guān)系表作為外部查詢的from中所要引用到的表,則這樣該查詢只需要執(zhí)行一次。這種優(yōu)化方法主要用于處理一張表被使用多次的情況(降低一張表的使用次數(shù)主要是在from后加入子查詢,該子查詢針對(duì)該使用多次的表,而且往往需要用到group by以及相應(yīng)的aggregation操作)
15、查詢優(yōu)化的兩種方式當(dāng)需要使用多次join的情況下,考慮使用exists和in來(lái)進(jìn)行查詢優(yōu)化降低連接表的個(gè)數(shù)(降維),當(dāng)有一張表被多次訪問(wèn)時(shí),要考慮合并其中的查詢(第六課)外鍵和索引如果沒(méi)有外鍵和引用的話,一次修改會(huì)導(dǎo)致多次修改大系統(tǒng)普遍取消外鍵的關(guān)聯(lián),取消參照完整性(降低在更新主表時(shí)候的過(guò)多引用)是提高數(shù)據(jù)庫(kù)性能的一個(gè)措施。如果有大量的外鍵關(guān)聯(lián),則做一次主表查詢可能會(huì)導(dǎo)致連接多個(gè)代碼表如果有外鍵的話,則需要對(duì)外鍵加上索引每個(gè)數(shù)據(jù)庫(kù)都會(huì)有一個(gè)自動(dòng)生成(遞增)的序列號(hào)自己解決:在插入一行數(shù)據(jù)的時(shí)候,需要先找到當(dāng)前的最大值,然后對(duì)當(dāng)前值遞增作為新數(shù)據(jù)的值??梢允褂靡粋€(gè)表,記錄其他表的當(dāng)前序列號(hào)的最大
16、值,每次更新后修改最大值。它帶來(lái)的問(wèn)題是串行化的插入,因?yàn)檫@個(gè)表需要被串行化的訪問(wèn),所以每一次對(duì)該數(shù)據(jù)庫(kù)的任意一張表插入新數(shù)據(jù)的動(dòng)作都必須是串行的為了解決上述的串行化訪問(wèn)的問(wèn)題,必須采用系統(tǒng)所提供的自動(dòng)遞增序列號(hào)的方式但是即便系統(tǒng)自動(dòng)生成的序列號(hào)可以并發(fā)進(jìn)行(導(dǎo)致插入數(shù)據(jù)可以并發(fā)進(jìn)行),但是索引不能并發(fā)(如果索引是連續(xù)的,則一般會(huì)在一個(gè)塊中),即便插入數(shù)據(jù)表的操作可以并發(fā),但是索引仍舊需要串行化操作解決上述問(wèn)題的方式:反向鍵索引/逆向索引。當(dāng)42、43、44三個(gè)記錄同時(shí)插入時(shí),可以插入到不同塊中實(shí)現(xiàn)并發(fā)插入,但是插入索引還是串行化的(索引鍵連續(xù),可能在同一塊中)??梢詫㈡I逆向變成24、34、4
17、4,此時(shí)它們不再連續(xù),就可能不在同一個(gè)塊中,可能可以實(shí)現(xiàn)并發(fā)插入使用上述方法,不僅在堆文件中可以實(shí)現(xiàn)并發(fā)插入(插入記錄),同時(shí)也可以在基本文件中實(shí)現(xiàn)并發(fā)插入(插入索引)質(zhì)疑:毫無(wú)意義的系統(tǒng)自動(dòng)生成鍵作為主鍵,是否有意義?(毫無(wú)意義的字段放到表中是否有意義?)如果不使用自動(dòng)生成鍵,可能不能保證主鍵的取值一定是唯一的(比如身份證都可能會(huì)重復(fù))不習(xí)慣使用非數(shù)值型的字段做表的主鍵從索引結(jié)構(gòu)的角度來(lái)看和對(duì)數(shù)值型索引的處理方式來(lái)看,字符串索引的處理速度遠(yuǎn)遠(yuǎn)小于對(duì)數(shù)值索引的處理速度沒(méi)有使用索引的情況謂詞中沒(méi)有使用索引的最前列,所有的B+樹(shù)都是在索引的第一個(gè)鍵值上構(gòu)建索引count(*)在全表中算行數(shù),不使用
18、到索引。如果鍵有控制,count()操作仍舊算這些記錄,但是索引中不記錄空值(B樹(shù)索引不對(duì)空值構(gòu)建索引,子節(jié)點(diǎn)中都有值)對(duì)于一個(gè)有索引的列做函數(shù)查詢或者隱形函數(shù)查詢(主要是時(shí)間和類(lèi)型變化這兩種隱形函數(shù)查詢)使用索引是否會(huì)帶來(lái)效率的提高(查詢優(yōu)化器根據(jù)統(tǒng)計(jì)信息進(jìn)行判斷)如果使用到索引反而會(huì)更慢。查詢優(yōu)化器未必會(huì)使用索引,使用前會(huì)先判斷使用索引有沒(méi)有價(jià)值,根據(jù)查詢的統(tǒng)計(jì)信息判斷是使用索引的評(píng)分高還是不使用索引的評(píng)分高如果查詢優(yōu)化器發(fā)現(xiàn)當(dāng)前的查詢不該使用索引,所以它所制定的查詢計(jì)劃不包括所提供鍵的索引查詢。查詢優(yōu)化器根據(jù)統(tǒng)計(jì)信息進(jìn)行判斷,如果統(tǒng)計(jì)信息是錯(cuò)誤的,則查詢優(yōu)化器的判斷也是錯(cuò)誤的使用索引的基
19、本要求是索引可用,且索引對(duì)查詢有幫助訪問(wèn)索引的方式是點(diǎn)狀訪問(wèn),得出的結(jié)果是滿足條件的所以快的編號(hào)。索引所做的工作是:通過(guò)索引找到所需要的記錄;讀取這個(gè)記錄(通過(guò)堆文件來(lái)讀取記錄)數(shù)據(jù)庫(kù)的物理實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)存在數(shù)據(jù)庫(kù)所設(shè)計(jì)的文件中,數(shù)據(jù)文件在絕大多數(shù)情況下是堆文件。我們看到的是該文件的邏輯過(guò)程(二維表的讀?。荒芸吹剿奈锢磉^(guò)程(記錄的存放、讀取)數(shù)據(jù)庫(kù)表是存儲(chǔ)方式的抽象過(guò)程,它屏蔽了所有的存儲(chǔ)過(guò)程的物理細(xì)節(jié)。比較關(guān)鍵的兩點(diǎn)是如何讀取數(shù)據(jù)以及數(shù)據(jù)的組織過(guò)程盡管物理結(jié)構(gòu)與SQL沒(méi)有直接關(guān)系,但是使用SQL的好壞卻受物理結(jié)構(gòu)的影響數(shù)據(jù)庫(kù)存在大量的沖突并發(fā)用戶數(shù)量大的系統(tǒng)緊湊:數(shù)據(jù)的緊湊程度和查
20、詢效率有正向相關(guān)關(guān)系。緊湊意味著一個(gè)塊中能夠存取更多的數(shù)據(jù),如果有一定的順序的話,數(shù)據(jù)的緊湊度直接影響查詢效率。如果塊中能存更多的記錄,則一次查詢所需要讀取的塊的數(shù)量會(huì)降低(全表遍歷的效率會(huì)提高)分散:從并發(fā)的角度來(lái)看,數(shù)據(jù)越緊湊則并發(fā)數(shù)越低。數(shù)據(jù)緊湊則塊數(shù)少,則能夠支持的并發(fā)數(shù)量少。(3000個(gè)并發(fā)是一個(gè)很大的并發(fā)概念)。為了提高并發(fā)數(shù)量,需要將數(shù)據(jù)存儲(chǔ)的更加分散。所以需要在查詢效率和并發(fā)數(shù)量中間取一個(gè)平衡點(diǎn)任何提高查詢效率的手段,都會(huì)帶來(lái)某些性能的下降。整體提高數(shù)據(jù)庫(kù)應(yīng)用效率的措施,應(yīng)當(dāng)是提高了大部分事務(wù)效率而降低了小部分事務(wù)的效率。頻繁事務(wù)效率提高的同時(shí),非頻繁事務(wù)的效率會(huì)下降。可能會(huì)使
21、用批處理的方式來(lái)處理頻繁事務(wù),而使用實(shí)時(shí)處理的方式來(lái)處理非頻繁事務(wù)IOT索引組織表(根據(jù)索引結(jié)構(gòu)存儲(chǔ)基本文件數(shù)據(jù),只有Oracle提供這種存儲(chǔ)方式)數(shù)據(jù)的組織不再是隨機(jī)地向某一個(gè)塊中插入,而是使用一個(gè)B+樹(shù)索引結(jié)構(gòu),在主鍵索引中存儲(chǔ)表中的所有數(shù)據(jù)(按照主鍵的順序在索引中存儲(chǔ)所有的數(shù)據(jù))優(yōu)點(diǎn):它是一個(gè)有順序的存儲(chǔ)方式,而不是隨機(jī)的。針對(duì)一定范圍的(有層次的范圍)查詢是非常高效的缺點(diǎn):更改文件的順序會(huì)造成極大的更新代價(jià),這種代價(jià)在隨機(jī)文件中就不存在本質(zhì):把一個(gè)數(shù)據(jù)庫(kù)文件存成index的方式聚簇索引比如有兩個(gè)表staff和department,分別有10個(gè)塊和3個(gè)塊用于存儲(chǔ)數(shù)據(jù)記錄。clustere
22、d index的存儲(chǔ)方式將這兩個(gè)表中融合在一起存儲(chǔ),比如在一個(gè)塊中存儲(chǔ)department表中ID=1的記錄,以及staff表中外鍵=1的所有記錄。塊中的存儲(chǔ)沒(méi)有順序優(yōu)點(diǎn):在查詢中需要join的情況(select name from staff where dID = ),這樣的存儲(chǔ)方式會(huì)提高查詢的效率數(shù)據(jù)庫(kù)分組原因:數(shù)據(jù)庫(kù)出錯(cuò)需要備份,數(shù)據(jù)庫(kù)使用redu、undo日志來(lái)進(jìn)行備份和回復(fù)(rollback),備份過(guò)程只能祈禱不要出錯(cuò),如果出錯(cuò),則整個(gè)備份活動(dòng)失敗。為了防止備份出錯(cuò),則可以將記錄分組,存在不同的物理設(shè)備上,這樣即使出錯(cuò),也只是一個(gè)分組的備份出錯(cuò)sybase最早提出partition
23、,希望能從管理數(shù)據(jù)庫(kù)的角度降低DBA的心理壓力。partition提供了一種數(shù)據(jù)管理的方法分組可以提高并發(fā)性舉例:當(dāng)物理并發(fā)滿足并發(fā)性要求后,會(huì)考慮提高數(shù)據(jù)密集度來(lái)提高查詢效率,所采用的方式是滑動(dòng)窗口如將存儲(chǔ)分成13個(gè)區(qū),前12個(gè)區(qū)存當(dāng)前12個(gè)月的數(shù)據(jù),最后一個(gè)區(qū)存歷史數(shù)據(jù);當(dāng)時(shí)間進(jìn)入到下一個(gè)月后,則為新的月新開(kāi)一個(gè)區(qū),而將倒數(shù)第二個(gè)區(qū)并入歷史數(shù)據(jù)中使用這種方式,當(dāng)月的數(shù)據(jù)存入獨(dú)立的空間中,必定會(huì)提高查詢效率,但是降低了并發(fā)大小的可能性,所以可以將當(dāng)月數(shù)據(jù)放入并發(fā)性較高的區(qū),而將歷史數(shù)據(jù)方式并發(fā)性較低的區(qū)并發(fā)時(shí),當(dāng)前月所在的區(qū)的并發(fā)率最高,資源競(jìng)爭(zhēng)最激烈。數(shù)據(jù)集中提高查詢效率,必然導(dǎo)致并發(fā)性下
24、降,所以應(yīng)當(dāng)從區(qū)的內(nèi)部提高并發(fā)性(比如提供很多存儲(chǔ)塊)以上均為物理存儲(chǔ),表面來(lái)講仍然是一個(gè)邏輯表分區(qū)方式根據(jù)記錄的值,將原來(lái)邏輯表中的數(shù)據(jù)按照行分到不同的分區(qū)中根據(jù)字段分區(qū),將不同的列存入不同的分區(qū)中,重點(diǎn)照顧頻繁訪問(wèn)到的列范圍分區(qū)、列表分區(qū),希望在查詢過(guò)程中讓數(shù)據(jù)更加具體,而哈希分區(qū)希望在更大程度上提高并發(fā)性(第七課)分區(qū)范圍分區(qū):根據(jù)字段的值把記錄分散在不同的物理存儲(chǔ)空間。分區(qū)最核心的目標(biāo)是為了方便管理滑動(dòng)窗口:按照時(shí)間分區(qū)可以使得最常使用到的數(shù)據(jù)被聚集在一起,這樣可以提高檢索效率。絕大部分銀行系統(tǒng)都是針對(duì)最近的數(shù)據(jù)加以訪問(wèn)可以把最需要的數(shù)據(jù)(當(dāng)月、當(dāng)前的數(shù)據(jù))放到最快的物理設(shè)備當(dāng)中,通過(guò)
25、物理的部署狀況來(lái)提高查詢效率哈希分區(qū):把數(shù)據(jù)按照某種不同的比例平均分在不同的物理區(qū)域,將數(shù)據(jù)分布的話出現(xiàn)錯(cuò)誤后回滾的壓力較小分區(qū)缺點(diǎn):從本質(zhì)上來(lái)說(shuō)降低了并發(fā)的個(gè)數(shù),但是在數(shù)據(jù)量非常龐大的情況下,降低并發(fā)所帶來(lái)的缺陷遠(yuǎn)遠(yuǎn)小于分區(qū)所提高的性能并發(fā)和數(shù)據(jù)密集的沖突是一對(duì)不能被解決的矛盾,或者讀和寫(xiě)是一對(duì)不能被解決的矛盾應(yīng)當(dāng)找到頻繁發(fā)生的事情,提高該事情的性能,并降低該事情所消耗的資源由于強(qiáng)制的數(shù)據(jù)聚合可能會(huì)導(dǎo)致其他數(shù)據(jù)的分散,所以不同的查詢請(qǐng)求也可能會(huì)形成性能上的矛盾分區(qū)注意:希望分區(qū)能夠平均分布,均衡;避免更新操作頻繁地移動(dòng)分區(qū),因?yàn)榉謪^(qū)的移動(dòng)會(huì)消耗大量的資源(以時(shí)間做partition key的
26、話,數(shù)據(jù)不會(huì)輕易移動(dòng))事務(wù)的三種狀態(tài):等待W;正在被處理P;結(jié)束D如果某一個(gè)事務(wù)正在被處理,則它所涉及的數(shù)據(jù)表(分區(qū))需要被鎖起來(lái),如果大量的事務(wù)同時(shí)涉及同一個(gè)分區(qū),則會(huì)導(dǎo)致并發(fā)數(shù)量的下降通過(guò)服務(wù)類(lèi)型進(jìn)行分區(qū):應(yīng)當(dāng)把數(shù)據(jù)均衡地分布到不同的分區(qū)中,比如T1處理第一個(gè)分區(qū),T2處理第二個(gè)分區(qū),則這兩個(gè)事務(wù)可以完全地并發(fā),不會(huì)導(dǎo)致并發(fā)數(shù)量下降通過(guò)狀態(tài)進(jìn)行分區(qū):分成三個(gè)區(qū)域,W區(qū)域存儲(chǔ)等待的數(shù)據(jù),P區(qū)域存儲(chǔ)正在被處理的數(shù)據(jù),D區(qū)域存儲(chǔ)已經(jīng)結(jié)束的數(shù)據(jù)。將所有等待的數(shù)據(jù)放在同一個(gè)區(qū)域中,則減少了輪詢所消耗的時(shí)間(不這樣做的話,則需要輪詢尋找第一個(gè)需要被處理的數(shù)據(jù))。每一個(gè)記錄在移動(dòng)分區(qū)的時(shí)候(狀態(tài)變化),
27、不存在并發(fā)的沖突(不需要將分區(qū)鎖起來(lái))。這種方案的最大特征:通過(guò)記錄在分區(qū)之間的不斷移動(dòng),可以降低某一個(gè)分區(qū)對(duì)同一個(gè)資源/記錄的競(jìng)爭(zhēng)壓力除了堆文件,所有的物理環(huán)境都能帶來(lái)復(fù)雜性;存儲(chǔ)方式的變化會(huì)導(dǎo)致性能的下降。解決這些問(wèn)題的方法只有測(cè)試層次機(jī)構(gòu)關(guān)系型數(shù)據(jù)庫(kù)無(wú)法直觀地解決層次式問(wèn)題,所以需要一種變換。關(guān)系型數(shù)據(jù)表中的字段之間是平級(jí)且等價(jià)的,沒(méi)有層次關(guān)系層次式結(jié)構(gòu)(樹(shù)狀結(jié)構(gòu))不能直接放在關(guān)系型數(shù)據(jù)庫(kù)中,需要變換一種形式。樹(shù)狀結(jié)構(gòu)中,節(jié)點(diǎn)之間有父子關(guān)系,存在兄弟節(jié)點(diǎn),有根節(jié)點(diǎn)也有子節(jié)點(diǎn)簡(jiǎn)單樹(shù)狀結(jié)構(gòu)要求:一個(gè)節(jié)點(diǎn)只有一個(gè)父節(jié)點(diǎn);所有的節(jié)點(diǎn)類(lèi)型都是一樣的。如果存在多個(gè)父節(jié)點(diǎn),則為物料單BOM簡(jiǎn)單樹(shù)狀結(jié)構(gòu)
28、的例子:檔案位置(樓-層-房間-櫥-柜),找到檔案是一個(gè)自頂向下的遍歷過(guò)程;風(fēng)險(xiǎn)分析(解決對(duì)沖基金的風(fēng)險(xiǎn)問(wèn)題,一個(gè)基金可能包含多種基金、股票,甚至有可能包含平級(jí)的基金。計(jì)算一個(gè)基金的風(fēng)險(xiǎn),要計(jì)算這個(gè)基金的組成部分的加權(quán)風(fēng)險(xiǎn))將簡(jiǎn)單樹(shù)狀結(jié)構(gòu)存儲(chǔ)到數(shù)據(jù)庫(kù)中(建模)鄰接模型,使用ID來(lái)存儲(chǔ)每一個(gè)節(jié)點(diǎn),使用PID(父節(jié)點(diǎn)ID)來(lái)存儲(chǔ)樹(shù)狀結(jié)構(gòu)。這種方式假設(shè)兄弟節(jié)點(diǎn)無(wú)序。這種方式不支持多父節(jié)點(diǎn),即物料單結(jié)構(gòu)。在單父節(jié)點(diǎn)的情況下,鄰接模型是最重要的存儲(chǔ)方式物化路徑模型,PathID(1,1.1,1.2,1.1.1,1.2.1,),使用層次式的路徑明確地標(biāo)識(shí)出來(lái)。它允許節(jié)點(diǎn)之間有順序(因?yàn)槁窂降臉?biāo)識(shí)有順序),
29、比如家族族譜嵌套集合模型,每一個(gè)節(jié)點(diǎn)都有一個(gè)左編號(hào)和右編號(hào)某一節(jié)點(diǎn)(A節(jié)點(diǎn))的所有節(jié)點(diǎn),它的左右編號(hào)都在A節(jié)點(diǎn)的左右編號(hào)之間按照深度遍歷進(jìn)行左編號(hào),遍歷到葉節(jié)點(diǎn)后再原路返回進(jìn)行右編號(hào),而后再繼續(xù)深度遍歷進(jìn)行左編號(hào)按照此遍歷方式,根節(jié)點(diǎn)的左編號(hào)是編號(hào)1,右編號(hào)是最后一個(gè)編號(hào)N,而它的第一個(gè)直接子節(jié)點(diǎn)的左編號(hào)是2,它的最后一個(gè)直接子節(jié)點(diǎn)的右編號(hào)是N-1當(dāng)發(fā)生更新之后,整個(gè)結(jié)構(gòu)的編號(hào)都要發(fā)生變化,所以增加節(jié)點(diǎn)和刪除節(jié)點(diǎn)會(huì)帶來(lái)很多開(kāi)銷(xiāo),所以較少使用使用這個(gè)方法,找到某一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)很方便,所有左編號(hào)和右編號(hào)在這個(gè)節(jié)點(diǎn)的左右編號(hào)之間的節(jié)點(diǎn),都是它的子節(jié)點(diǎn)(第八課)作業(yè)2A - B有一個(gè)班次G7001,
30、中間途徑C、D?,F(xiàn)在可能購(gòu)買(mǎi)A-C的車(chē)票,C-B的車(chē)票,這種情況下怎么在數(shù)據(jù)庫(kù)表結(jié)構(gòu)中間解決這個(gè)問(wèn)題。即實(shí)現(xiàn)區(qū)間購(gòu)買(mǎi)票的記錄,以及對(duì)剩余票的檢索抽象和實(shí)際的問(wèn)題。G7001是一個(gè)抽象的概念,真正跑的車(chē)次是今天早晨8:00出發(fā)的G7001。對(duì)于這樣的火車(chē)編號(hào)來(lái)說(shuō),它一天最多只開(kāi)一班,但是有可能隔天發(fā)車(chē),比如每周2、4、6、1發(fā)車(chē)(或者每隔1/2天發(fā)車(chē);或者每隔兩天,同時(shí)逢10號(hào)開(kāi)),需要判斷這班火車(chē)今天是否開(kāi)車(chē)。探討如何將這個(gè)內(nèi)容記錄在數(shù)據(jù)庫(kù)中(可以存儲(chǔ)規(guī)則,也可以存儲(chǔ)當(dāng)前時(shí)刻表。不好使用存儲(chǔ)、比對(duì)字符串的方式)火車(chē)上有一組對(duì)應(yīng)的班組人員(班組成員的數(shù)量會(huì)有規(guī)則,即為潛在的約束),包括一個(gè)司機(jī)、
31、一個(gè)列車(chē)長(zhǎng)、若干列車(chē)員、一個(gè)車(chē)警。班組人員可能會(huì)變動(dòng),而且每天的G7001不可能都是同一個(gè)班組,所以需要一個(gè)排班表??赡軙?huì)查詢某一天的某一個(gè)班次的班組人員,也可能會(huì)統(tǒng)計(jì)某個(gè)車(chē)警一周工作的天數(shù)每一列真實(shí)運(yùn)行的班次都有可能晚點(diǎn),比如在C點(diǎn)晚點(diǎn),如何計(jì)算實(shí)際到達(dá)B點(diǎn)的時(shí)間。有些情況下以上內(nèi)容可以記錄在數(shù)據(jù)庫(kù)中,有些情況下可以即時(shí)計(jì)算A-B-C-D,要記錄在B-C之間有哪些具體的座位賣(mài)出去了,哪些具體的座位沒(méi)有賣(mài)出去作業(yè)要求(作業(yè)1和作業(yè)2都要如此)以文本提交作業(yè)結(jié)果提供一個(gè)數(shù)據(jù)庫(kù)模式(即數(shù)據(jù)庫(kù)表結(jié)構(gòu)),最簡(jiǎn)單的表結(jié)構(gòu)T(column1, column2, column3, column4)提供一個(gè)滿
32、足查詢的SQL語(yǔ)句可以提供多種數(shù)據(jù)庫(kù)設(shè)計(jì),并且運(yùn)行在不同的平臺(tái)之上,并說(shuō)明它們的不同以create table的方式構(gòu)建表結(jié)構(gòu),使用關(guān)鍵字check來(lái)設(shè)置表結(jié)構(gòu)的約束例子:普法戰(zhàn)爭(zhēng)自頂向下查詢,查詢Vandamme所管轄的所有部隊(duì)鄰接模型查找某一個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn),這是一個(gè)典型的遞歸過(guò)程。首先需要找到這個(gè)節(jié)點(diǎn)的所有直接子節(jié)點(diǎn),查出來(lái)之后放在一個(gè)臨時(shí)表中;然后遍歷臨時(shí)表,找到表里每一個(gè)節(jié)點(diǎn)的直接子節(jié)點(diǎn),繼續(xù)放入臨時(shí)表中。直到?jīng)]有新的節(jié)點(diǎn)放入臨時(shí)表中,則遞歸結(jié)束,臨時(shí)表存放了一開(kāi)始的節(jié)點(diǎn)的所有子節(jié)點(diǎn)實(shí)現(xiàn)遞歸過(guò)程,Oracle提供的關(guān)鍵字connect by。而SQL標(biāo)準(zhǔn)實(shí)現(xiàn)遞歸的關(guān)鍵字是with,
33、DB2最早使用with。with是一個(gè)基于關(guān)系操作的遞歸過(guò)程,而connect by完全地去關(guān)系化,是一個(gè)基于過(guò)程的查詢方式,所以它的查詢效率非常高對(duì)于物化路徑的存儲(chǔ)方式,子節(jié)點(diǎn)的前綴就是父節(jié)點(diǎn)的路徑,找到某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn),只需要匹配它們的前綴即可。但是物化路徑的效率不如鄰接模型的效率高,因?yàn)槲锘窂阶铌P(guān)鍵的部分是字符串比較,它最大的問(wèn)題是拆分字符串可以使用01010102來(lái)代替路徑1.1.1.2,計(jì)算它的深度就是路徑字符串長(zhǎng)度除以二,即strlen(“01010102”)/2使用一個(gè)系統(tǒng)自動(dòng)生成的ID,而不是使用物化的路徑作為字段ID嵌套集合模型,子節(jié)點(diǎn)的left_num和right_num
34、都在根節(jié)點(diǎn)的left_num和right_num的范圍之內(nèi)。它無(wú)法直接獲得節(jié)點(diǎn)的層次自底向上查詢,查詢某一個(gè)子節(jié)點(diǎn)的所有祖先節(jié)點(diǎn)關(guān)系操作可以合并相同的父節(jié)點(diǎn),很容易地找到所有的祖先結(jié)果集,但是不能做到很好的層次排序MySQL有一個(gè)機(jī)制,可以解決字串索引的問(wèn)題,substring index因?yàn)樽缘紫蛏闲枰闅v多個(gè)節(jié)點(diǎn),而自頂向下只需要遍歷一個(gè)節(jié)點(diǎn),所以物化路徑的方式,自底向上的查詢效率遠(yuǎn)遠(yuǎn)低于自頂向下的查詢效率對(duì)于嵌套集合模型,自頂向下和自底向上的查詢效率相同,它們的差異僅僅體現(xiàn)在自底向上查詢的排序過(guò)程,這個(gè)排序比較耗時(shí)間樹(shù)狀結(jié)構(gòu)的聚合計(jì)算在部隊(duì)的樹(shù)狀結(jié)構(gòu)中,葉節(jié)點(diǎn)往往存儲(chǔ)一個(gè)數(shù)值,說(shuō)明了一個(gè)
35、團(tuán)的士兵人數(shù)。可以將兄弟葉節(jié)點(diǎn)聚合,得到它們的父節(jié)點(diǎn)的數(shù)值,即一個(gè)旅的士兵人數(shù)使用oracle的connect by關(guān)鍵字進(jìn)行遞歸。connect by .start with方式,只能獲取自頂向下和自底向上的最終結(jié)果,而不保存中間的遞歸過(guò)程,所以每一級(jí)別都需要做一次自底向上的操作,效率降低(第九課)要封裝數(shù)據(jù)庫(kù),JDBC仍然不方便,因?yàn)榇嬖陉P(guān)系和關(guān)系對(duì)象之間的mismatch一個(gè)對(duì)象不可能存在一張關(guān)系表中,如果這樣存儲(chǔ),則應(yīng)當(dāng)為對(duì)象數(shù)據(jù)庫(kù)而不是關(guān)系數(shù)據(jù)庫(kù)。一個(gè)對(duì)象可能存在多張表中ORM,封裝數(shù)據(jù)訪問(wèn)的過(guò)程。數(shù)據(jù)封裝層主要用來(lái)屏蔽業(yè)務(wù)邏輯,屏蔽OO與關(guān)系之間的差異性,設(shè)置關(guān)系表和對(duì)象之間的關(guān)系
36、數(shù)據(jù)庫(kù)封裝的優(yōu)點(diǎn)應(yīng)用程序員能夠?qū)W⒂冢☉?yīng)用的)業(yè)務(wù)問(wèn)題可以實(shí)現(xiàn)公共的面向的對(duì)象的業(yè)務(wù)規(guī)則仍舊能夠利用數(shù)據(jù)庫(kù)的特性提高應(yīng)用程序的性能(第十課)數(shù)據(jù)庫(kù)方法學(xué)Database planning,數(shù)據(jù)庫(kù)設(shè)計(jì)的計(jì)劃System definition,最主要的是定義系統(tǒng)的邊界Requirements collection and analysis,需求分析和收集,收集表單和行為Database design,邏輯設(shè)計(jì)(與具體的數(shù)據(jù)庫(kù)無(wú)關(guān))和物理設(shè)計(jì)(與具體的數(shù)據(jù)庫(kù)有關(guān))比如在構(gòu)建索引的時(shí)候,就從邏輯數(shù)據(jù)庫(kù)設(shè)計(jì)進(jìn)入物理數(shù)據(jù)庫(kù)設(shè)計(jì)。數(shù)據(jù)庫(kù)系統(tǒng)與文件系統(tǒng)的差別,在于并發(fā)修改(而不是并發(fā)讀)。數(shù)據(jù)庫(kù)系統(tǒng)是處于并發(fā)
37、修改的最好載體;數(shù)據(jù)量大并不足以使文件系統(tǒng)轉(zhuǎn)變成數(shù)據(jù)庫(kù),而如果數(shù)據(jù)關(guān)系復(fù)雜的話,則需要將信息存入數(shù)據(jù)庫(kù)中;必須要安全存儲(chǔ)的信息需要存到數(shù)據(jù)庫(kù)中。正常情況下,文件系統(tǒng)的效率遠(yuǎn)遠(yuǎn)高于數(shù)據(jù)庫(kù)的效率DBMS selection,選擇哪一個(gè)具體數(shù)據(jù)庫(kù)。如果有遺留數(shù)據(jù)庫(kù),則選擇遺留的數(shù)據(jù)庫(kù)系統(tǒng);或者某個(gè)數(shù)據(jù)庫(kù)系統(tǒng)有其他數(shù)據(jù)庫(kù)沒(méi)有的特性,比如OracleApplication designPrototypingImplementationData conversion and loading,數(shù)據(jù)轉(zhuǎn)換指的是數(shù)據(jù)庫(kù)的遷移,loading指的是對(duì)遺留數(shù)據(jù)庫(kù)的重構(gòu)TestingOperational mainte
38、nance邏輯設(shè)計(jì)(ER圖)。ER圖最大的問(wèn)題是,其在UML中沒(méi)有標(biāo)準(zhǔn)MDA模型驅(qū)動(dòng)架構(gòu)。畫(huà)完UML圖后,程序結(jié)構(gòu)和邏輯就可以生成強(qiáng)實(shí)體和弱實(shí)體。強(qiáng)實(shí)體是可以由自己的主鍵標(biāo)識(shí)自己的實(shí)體,比如課程有課程號(hào),學(xué)生有學(xué)號(hào),都是強(qiáng)實(shí)體。如果選課是由課程號(hào)和學(xué)好來(lái)限制的話,則其沒(méi)有標(biāo)識(shí)自己的主鍵,屬于弱實(shí)體;如果選課有一個(gè)選課流水號(hào)來(lái)標(biāo)識(shí)自己的話,則它也算是強(qiáng)實(shí)體關(guān)于人與公司的雇傭關(guān)系,可以有兩種設(shè)計(jì)表達(dá):(1)人與公司是多對(duì)多的關(guān)系,它們產(chǎn)生一個(gè)雇傭關(guān)系,雇傭關(guān)系中有雇傭的屬性;(2)人與公司沒(méi)有直接的關(guān)系,人可以有多份合同說(shuō)明他所在的公司以及相關(guān)的雇傭?qū)傩?,公司也可以有多份合同說(shuō)明它雇傭的員工。第一
39、種中,雇傭關(guān)系是弱實(shí)體,一個(gè)員工和一個(gè)公司只可能產(chǎn)生一個(gè)關(guān)聯(lián)實(shí)例;第二種中,合同是強(qiáng)實(shí)體,一個(gè)員工和一個(gè)公司可以產(chǎn)生多個(gè)關(guān)聯(lián)實(shí)例(因?yàn)楹贤珊贤?hào)來(lái)標(biāo)識(shí))注意ER模型中的一對(duì)一、一對(duì)多、多對(duì)一、多對(duì)多的關(guān)系,以及一個(gè)實(shí)體是否強(qiáng)制參與某個(gè)關(guān)系1:1,一對(duì)一全部參與可以放在一張表中,并且不會(huì)有空值一對(duì)一部分參與必須分在兩張表中,如果放在一張表中則會(huì)出現(xiàn)很多空值。如果是一個(gè)全部參與一個(gè)部分參與的話,則將全部參與的實(shí)體的主鍵放在部分參與的表中作為外鍵(以此來(lái)描述他們的對(duì)應(yīng)關(guān)系);如果兩個(gè)都是部分參與的話,則參與更多的一方的主鍵放入?yún)⑴c更少的一方的表中作為外鍵,這樣能產(chǎn)生較少的空值多對(duì)多會(huì)產(chǎn)生一個(gè)關(guān)系表
40、,將相關(guān)的兩個(gè)實(shí)體的主鍵作為復(fù)合外鍵,作為關(guān)系實(shí)體的主鍵。這樣關(guān)系產(chǎn)生的實(shí)體是一個(gè)弱實(shí)體強(qiáng)制性地表達(dá)表中的完整性約束,no action,cascade,set null,set default,no check。這些關(guān)鍵字說(shuō)明了主鍵被刪除后,外鍵應(yīng)該怎么辦數(shù)據(jù)庫(kù)泛化的問(wèn)題。比如設(shè)置一個(gè)Staff實(shí)體為父實(shí)體,它有manager、salesPersonnel、secretary三個(gè)子實(shí)體,它們共享父實(shí)體中的屬性。這種結(jié)構(gòu)會(huì)產(chǎn)生以下的約束參與約束,participation constraint,是不是所有的實(shí)例都存在于某一個(gè)子實(shí)體中,父實(shí)體只是一個(gè)抽象的概念。即是不是所有的員工都屬于某一個(gè)職位
41、,如果有一個(gè)員工不是子實(shí)體中的一員,則他為父實(shí)體的實(shí)例,這屬于部分參與disjoint constraint,互斥約束。一個(gè)實(shí)例是不是只屬于一個(gè)子實(shí)體。如果一個(gè)人,他既是manager又是sales,則manager和sales這兩個(gè)子實(shí)體是overlap的,不是disjoint的數(shù)據(jù)庫(kù)泛化的約束產(chǎn)生的結(jié)果mandatory + nondisjoint,完全參與且不互斥,則所有的父實(shí)體+子實(shí)體都使用一張表,雖然可能會(huì)因?yàn)槟硞€(gè)實(shí)例不屬于某一個(gè)子實(shí)體而產(chǎn)生空值,但是產(chǎn)生的空值比較少,所以可以optional + nondisjoint,部分參與且不互斥,則將父實(shí)體做成單獨(dú)的一張表,所有的子實(shí)體做成
42、一張表mandatory + disjoint,完全參與,但是互斥,則父實(shí)體產(chǎn)生一個(gè)主表,子實(shí)體分別分成一個(gè)表optional + disjoint,部分參與,但是互斥,則父實(shí)體產(chǎn)生一個(gè)主表,子實(shí)體分別分成一個(gè)表。只要是disjoint的情況,都要將子實(shí)體拆分成獨(dú)立的子表逆范式/反范式(打破三范式的規(guī)則來(lái)生成冗余數(shù)據(jù))合并1:1關(guān)系部分合并1:*關(guān)系,不復(fù)制外關(guān)鍵字而復(fù)制常用的字段比如staff和department之間有一對(duì)多的關(guān)系,將department中常被連接查詢的字段復(fù)制并遷移到staff表中(比如department的名字是一般需要查詢到的,則將名字放入staff表中,這樣查詢st
43、aff所屬部門(mén)的名字時(shí)就不需要連接兩個(gè)表了),降低連接查詢的數(shù)量使用“一致性控制”模式來(lái)保證兩個(gè)表中冗余字段的一致性,這種控制放在UI界面中進(jìn)行,使用combo list或者check box進(jìn)行選擇,而不是獲取用戶的輸入在1:*關(guān)系中復(fù)制外關(guān)鍵字在*:*關(guān)系中復(fù)制屬性比如多對(duì)多關(guān)系的orders、articles的關(guān)系,有一個(gè)關(guān)系表中保存了oid和aid。如果要知道某個(gè)訂單中某個(gè)產(chǎn)品的名字和價(jià)格的話,則需要三表連接在現(xiàn)今的電子商務(wù)系統(tǒng)中,article的某些屬性會(huì)直接復(fù)制到關(guān)系表中,即關(guān)系表中除了oid和aid之后,還包括price(price現(xiàn)在已經(jīng)是缺省放入關(guān)系表的字段)、article name、數(shù)量為了避免查詢和更新這兩個(gè)不可調(diào)和的矛盾,可以將更新和查詢放在兩張表中,從工作表提取出查詢表,專門(mén)用于查詢。這個(gè)方法演化成了數(shù)據(jù)倉(cāng)庫(kù)。這個(gè)方法只適用于查詢的實(shí)時(shí)性要求不高的情況物理設(shè)計(jì)(第十一課)SAP + HANA數(shù)據(jù)以列的形式存在數(shù)據(jù)庫(kù)中。當(dāng)需要查詢某幾個(gè)列的數(shù)據(jù)時(shí),只需要將這幾個(gè)列中的數(shù)據(jù)移入內(nèi)存之中(第十二課)列數(shù)據(jù)庫(kù)column family: 任何的co
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)廠房乳膠漆粉刷施工合同
- 臨時(shí)美食廣場(chǎng)租賃合同
- 水上運(yùn)動(dòng)中心泳池改造合同
- 科研院所人才引進(jìn)合同模板
- 旅游景點(diǎn)土建施工合同
- 銷(xiāo)售年度工作計(jì)劃5篇3
- 環(huán)衛(wèi)工人聘用合同
- 塑料機(jī)械租賃合同模板
- 電力設(shè)施維護(hù)與安全作業(yè)守則
- 商業(yè)街改造建筑平房施工合同
- 人教版三年級(jí)數(shù)學(xué)下冊(cè)數(shù)學(xué)廣角搭配二教案
- TMF自智網(wǎng)絡(luò)白皮書(shū)4.0
- 電視劇《國(guó)家孩子》觀影分享會(huì)PPT三千孤兒入內(nèi)蒙一段流淌著民族大愛(ài)的共和國(guó)往事PPT課件(帶內(nèi)容)
- 所水力除焦設(shè)備介紹
- 改革開(kāi)放英語(yǔ)介紹-課件
- pet考試歷屆真題和答案
- 《企業(yè)員工薪酬激勵(lì)問(wèn)題研究10000字(論文)》
- 大學(xué)英語(yǔ)三級(jí)B真題2023年06月
- GB/T 7909-2017造紙木片
- GB/T 25217.6-2019沖擊地壓測(cè)定、監(jiān)測(cè)與防治方法第6部分:鉆屑監(jiān)測(cè)方法
- 中醫(yī)學(xué)課件 治則與治法
評(píng)論
0/150
提交評(píng)論