版權(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ì)規(guī)范化的五個(gè)要求通常情況下,可以從兩個(gè)方面來(lái)判斷數(shù)據(jù)庫(kù)是否設(shè)計(jì)的比較規(guī)范。一是看看是否擁有大量的窄表,二是寬表的數(shù)量是否足夠的少。若符合這兩個(gè)條件,則可以說(shuō)明這個(gè)數(shù)據(jù)庫(kù)的規(guī)范化水平還是比較高的。當(dāng)然這是兩個(gè)泛泛而談的指標(biāo)。為了達(dá)到數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范化的要求,一般來(lái)說(shuō),需要符合以下五個(gè)要求。要求一:表中應(yīng)該避免可為空的列。雖然表中允許空列,但是,空字段是一種比較特殊的數(shù)據(jù)類型。數(shù)據(jù)庫(kù)在處理的時(shí)候,需要進(jìn)行特殊的處理。如此的話,就會(huì)增加數(shù)據(jù)庫(kù)處理記錄的復(fù)雜性。當(dāng)表中有比較多的空字段時(shí),在同等條件下,數(shù)據(jù)庫(kù)處理的性能會(huì)降低許多。所以,雖然在數(shù)據(jù)庫(kù)表設(shè)計(jì)的時(shí)候,允許表中具有空字段,但是,我們應(yīng)該
2、盡量避免。若確實(shí)需要的話,我們可以通過(guò)一些折中的方式,來(lái)處理這些空字段,讓其對(duì)數(shù)據(jù)庫(kù)性能的影響降低到最少。一是通過(guò)設(shè)置默認(rèn)值的形式,來(lái)避免空字段的產(chǎn)生。如在一個(gè)人事管理系統(tǒng)中,有時(shí)候身份證號(hào)碼字段可能允許為空。因?yàn)椴皇敲總€(gè)人都可以記住自己的身份證號(hào)碼。而在員工報(bào)到的時(shí)候,可能身份證沒(méi)有帶在身邊。所以,身份證號(hào)碼字段往往不能及時(shí)提供。為此,身份證號(hào)碼字段可以允許為空,以滿足這些特殊情況的需要。但是,在數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候,則可以做一些處理。如當(dāng)用戶沒(méi)有輸入內(nèi)容的時(shí)候,則把這個(gè)字段的默認(rèn)值設(shè)置為0 或者為N/A。以避免空字段的產(chǎn)生。二是若一張表中,允許為空的列比較多,接近表全部列數(shù)的三分之一。而且,
3、這些列在大部分情況下,都是可有可無(wú)的。若數(shù)據(jù)庫(kù)管理員遇到這種情況,筆者建議另外建立一張副表, 以保存這些列。然后通過(guò)關(guān)鍵字把主表跟這張副表關(guān)聯(lián)起來(lái)。將數(shù)據(jù)存儲(chǔ)在兩個(gè)獨(dú)立的表中使得主表的設(shè)計(jì)更為簡(jiǎn)單,同時(shí)也能夠滿足存儲(chǔ)空值信息的需要。要求二:表不應(yīng)該有重復(fù)的值或者列。如現(xiàn)在有一個(gè)進(jìn)銷存管理系統(tǒng),這個(gè)系統(tǒng)中有一張產(chǎn)品基本信息表中。這個(gè)產(chǎn)品開(kāi)發(fā)有時(shí)候可以是一個(gè)人完成,而有時(shí)候又需要多個(gè)人合作才能夠完成。所以, 在產(chǎn)品基本信息表產(chǎn)品開(kāi)發(fā)者這個(gè)字段中,有時(shí)候可能需要填入多個(gè)開(kāi)發(fā)者的名字。如進(jìn)銷存管理中,還需要對(duì)客戶的聯(lián)系人進(jìn)行管理。有時(shí)候, 企業(yè)可能只知道客戶一個(gè)采購(gòu)員的姓名。但是在必要的情況下,企業(yè)需
4、要對(duì)客戶的采購(gòu)代表、倉(cāng)庫(kù)人員、財(cái)務(wù)人員共同進(jìn)行管理。因?yàn)樵谟唵紊希赡苄枰钊氩少?gòu)代表的名字; 可是在出貨單上,則需要填入倉(cāng)庫(kù)管理人員的名字等等。為了解決這個(gè)問(wèn)題,有多種實(shí)現(xiàn)方式。但是,若設(shè)計(jì)不合理的話在,則會(huì)導(dǎo)致重復(fù)的值或者列。如我們也可以這么設(shè)計(jì),把客戶信息、聯(lián)系人都放入同一張表中。為了解決多個(gè)聯(lián)系人的問(wèn)題,可以設(shè)置第一聯(lián)系人、第一聯(lián)系人電話、第二聯(lián)系人、第二聯(lián)系人電話等等。若還有第三聯(lián)系人、第四聯(lián)系人等等,則往往還需要加入更多的字段??墒沁@么設(shè)計(jì)的話,會(huì)產(chǎn)生一系列的問(wèn)題。如客戶的采購(gòu)員流動(dòng)性比較大,在一年內(nèi)換了六個(gè)采購(gòu)員。此時(shí), 在系統(tǒng)中該如何管理呢?難道就建立六個(gè)聯(lián)系人字段?這不但會(huì)導(dǎo)
5、致空字段的增加,還需要頻繁的更改數(shù)據(jù)庫(kù)表結(jié)構(gòu)。明顯,這么做是不合理的。也有人說(shuō),可以直接修改采購(gòu)員的名字呀??墒沁@么處理的話,會(huì)把原先采購(gòu)訂單上采購(gòu)員的名字也改變了。因?yàn)椴少?gòu)單上客戶采購(gòu)員信息在數(shù)據(jù)庫(kù)中存儲(chǔ)的不是采購(gòu)員的名字,而只是采購(gòu)員對(duì)應(yīng)的一個(gè)編號(hào)。在編號(hào)不改而名字改變了的情況下,采購(gòu)訂單上顯示的就是更改后的名字。這不利于時(shí)候的追蹤。所以, 在數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候要盡量避免這種重復(fù)的值或者列的產(chǎn)生。筆者建議,若數(shù)據(jù)庫(kù)管理員遇到這種情況,可以改變一下策略。如把客戶聯(lián)系人另外設(shè)置一張表。然后通過(guò)客戶 ID 把供應(yīng)商信息表跟客戶聯(lián)系人信息表連接起來(lái)。也就是說(shuō),盡量將重復(fù)的值放置到一張獨(dú)立的表中進(jìn)行管
6、理。然后通過(guò)視圖或者其他手段把這些獨(dú)立的表聯(lián)系起來(lái)。要求三:表中記錄應(yīng)該有一個(gè)唯一的標(biāo)識(shí)符。在數(shù)據(jù)庫(kù)表設(shè)計(jì)的時(shí)候,數(shù)據(jù)庫(kù)管理員應(yīng)該養(yǎng)成一個(gè)好習(xí)慣,用一個(gè)ID 號(hào)來(lái)唯一的標(biāo)識(shí)行記錄,而不要通過(guò)名字、編號(hào)等字段來(lái)對(duì)紀(jì)錄進(jìn)行區(qū)分。每個(gè)表都應(yīng)該有一個(gè)ID 列,任何兩個(gè)記錄都不可以共享同一個(gè)ID 值。另外,這個(gè)ID 值最好有數(shù)據(jù)庫(kù)來(lái)進(jìn)行自動(dòng)管理,而不要把這個(gè)任務(wù)給前臺(tái)應(yīng)用程序。否則的話,很容易產(chǎn)生ID 值不統(tǒng)一的情況。另外,在數(shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候,最好還能夠加入行號(hào)。如在銷售訂單管理中,ID 號(hào)是用戶不能夠維護(hù)的。但是,行號(hào)用戶就可以維護(hù)。如在銷售訂單的行中,用戶可以通過(guò)調(diào)整行號(hào)的大小來(lái)對(duì)訂單行進(jìn)行排序。通
7、常情況下,ID 列是以 1 為單位遞進(jìn)的。但是,行號(hào)就要以 10 為單位累進(jìn)。如此,正常情況下,行號(hào)就以10、20、 30 依次擴(kuò)展下去。若此時(shí)用戶需要把行號(hào)為30 的紀(jì)錄調(diào)到第一行顯示。此時(shí), 用戶在不能夠更改ID 列的情況下,可以更改行號(hào)來(lái)實(shí)現(xiàn)。如可以把行號(hào)改為1,在排序時(shí)就可以按行號(hào)來(lái)進(jìn)行排序。如此的話,原來(lái)行號(hào)為 30 的紀(jì)錄現(xiàn)在行號(hào)變?yōu)榱? ,就可以在第一行中顯示。這是在實(shí)際應(yīng)用程序設(shè)計(jì)中對(duì) ID 列的一個(gè)有效補(bǔ)充。這個(gè)內(nèi)容在教科書上是沒(méi)有的。需要在實(shí)際應(yīng)用程序設(shè)計(jì)中,才會(huì)掌握到這個(gè)技巧。要求四:數(shù)據(jù)庫(kù)對(duì)象要有統(tǒng)一的前綴名。一個(gè)比較復(fù)雜的應(yīng)用系統(tǒng),其對(duì)應(yīng)的數(shù)據(jù)庫(kù)表往往以千計(jì)。若讓數(shù)據(jù)
8、庫(kù)管理員看到對(duì)象名就了解這個(gè)數(shù)據(jù)庫(kù)對(duì)象所起的作用,恐怕會(huì)比較困難。而且在數(shù)據(jù)庫(kù)對(duì)象引用的時(shí)候,數(shù)據(jù)庫(kù)管理員也會(huì)為不能迅速找到所需要的數(shù)據(jù)庫(kù)對(duì)象而頭疼。為此, 筆者建立,在開(kāi)發(fā)數(shù)據(jù)庫(kù)之前,最好能夠花一定的時(shí)間,去制定一個(gè)數(shù)據(jù)庫(kù)對(duì)象的前綴命名規(guī)范。如筆者在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),喜歡跟前臺(tái)應(yīng)用程序協(xié)商,確定合理的命名規(guī)范。筆者最常用的是根據(jù)前臺(tái)應(yīng)用程序的模塊來(lái)定義后臺(tái)數(shù)據(jù)庫(kù)對(duì)象前綴名。如跟物料管理模塊相關(guān)的表可以用 M為前綴;而以訂單管理相關(guān)的,則可以利用C作為前綴。具體采用什么前綴可以以用戶的愛(ài)好而定義。但是, 需要注意的是,這個(gè)命名規(guī)范應(yīng)該在數(shù)據(jù)庫(kù)管理員與前臺(tái)應(yīng)用程序開(kāi)發(fā)者之間達(dá)成共識(shí),并且嚴(yán)格按照這個(gè)
9、命名規(guī)范來(lái)定義對(duì)象名。其次,表、視圖、函數(shù)等最好也有統(tǒng)一的前綴。如視圖可以用V 為前綴,而函數(shù)則可以利用 F 為前綴。 如此數(shù)據(jù)庫(kù)管理員無(wú)論是在日常管理還是對(duì)象引用的時(shí)候,都能夠在最短的時(shí)間內(nèi)找到自己所需要的對(duì)象。要求五:盡量只存儲(chǔ)單一實(shí)體類型的數(shù)據(jù)。這里將的實(shí)體類型跟數(shù)據(jù)類型不是一回事,要注意區(qū)分。這里講的實(shí)體類型是指所需要描述對(duì)象的本身。筆者舉一個(gè)例子,估計(jì)大家就可以明白其中的內(nèi)容了。如現(xiàn)在有一個(gè)圖書館里系統(tǒng),有圖書基本信息、作者信息兩個(gè)實(shí)體對(duì)象。若用戶要把這兩個(gè)實(shí)體對(duì)象信息放在同一張表中也是可以的。如可以把表設(shè)計(jì)成圖書名字、圖書作者等等??墒侨绱嗽O(shè)計(jì)的話,會(huì)給后續(xù)的維護(hù)帶來(lái)不少的麻煩。如
10、當(dāng)后續(xù)有圖書出版時(shí),則需要為每次出版的圖書增加作者信息,這無(wú)疑會(huì)增加額外的存儲(chǔ)空間,也會(huì)增加記錄的長(zhǎng)度。而且若作者的情況有所改變,如住址改變了以后,則還需要去更改每本書的記錄。同時(shí), 若這個(gè)作者的圖書從數(shù)據(jù)庫(kù)中全部刪除之后,這個(gè)作者的信息也就蕩然無(wú)存了。很明顯,這不符合數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范化的需求。遇到這種情況時(shí),筆者建議可以把上面這張表分解成三種獨(dú)立的表,分別為圖書基本信息表、 作者基本信息表、圖書與作者對(duì)應(yīng)表等等。如此設(shè)計(jì)以后,以上遇到的所有問(wèn)題就都引刃而解了。以上五條是在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)達(dá)到規(guī)范化水平的基本要求。除了這些另外還有很多細(xì)節(jié)方面的要求,如數(shù)據(jù)類型、存儲(chǔ)過(guò)程等等。而且,數(shù)據(jù)庫(kù)規(guī)范往往沒(méi)有
11、技術(shù)方面的嚴(yán)格限制,主要依靠數(shù)據(jù)庫(kù)管理員日常工作經(jīng)驗(yàn)的累積。數(shù)據(jù)庫(kù)設(shè)計(jì)中的反規(guī)范技術(shù)探討1. 數(shù)據(jù)庫(kù)設(shè)計(jì)簡(jiǎn)述數(shù)據(jù)庫(kù)設(shè)計(jì)是把現(xiàn)實(shí)世界的商業(yè)模型與需求轉(zhuǎn)換成數(shù)據(jù)庫(kù)的模型的過(guò)程,它是建立數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的核心問(wèn)題。設(shè)計(jì)的關(guān)鍵是如何使設(shè)計(jì)的數(shù)據(jù)庫(kù)能合理地存儲(chǔ)用戶的數(shù)據(jù),方便用戶進(jìn)行數(shù)據(jù)處理。數(shù)據(jù)庫(kù)設(shè)計(jì)完全是人的問(wèn)題,而不是數(shù)據(jù)庫(kù)管理系統(tǒng)的問(wèn)題。系統(tǒng)不管設(shè)計(jì)是好是壞,照樣運(yùn)行。數(shù)據(jù)庫(kù)設(shè)計(jì)應(yīng)當(dāng)由數(shù)據(jù)庫(kù)管理員和系統(tǒng)分析員一起和用戶一道工作,了解各個(gè)用戶的要求,共同為整個(gè)數(shù)據(jù)庫(kù)做出恰當(dāng)?shù)?、完整的設(shè)計(jì)。數(shù)據(jù)庫(kù)及其應(yīng)用的性能和調(diào)優(yōu)都是建立在良好的數(shù)據(jù)庫(kù)設(shè)計(jì)的基礎(chǔ)上,數(shù)據(jù)庫(kù)的數(shù)據(jù)是一切操作的基礎(chǔ),如果數(shù)據(jù)庫(kù)設(shè)計(jì)不好,
12、則其它一切調(diào)優(yōu)方法提高數(shù)據(jù)庫(kù)性能的效果都是有限的。數(shù)據(jù)的規(guī)范化1.1. 范式概述規(guī)范化理論是研究如何將一個(gè)不好的關(guān)系模式轉(zhuǎn)化為好的關(guān)系模式的理論,規(guī)范化理論是圍繞范式而建立的。規(guī)范化理論認(rèn)為,一個(gè)關(guān)系數(shù)據(jù)庫(kù)中所有的關(guān)系,都應(yīng)滿足一定的規(guī)范 (約束條件)。規(guī)范化理論把關(guān)系應(yīng)滿足的規(guī)范要求分為幾級(jí),滿足最低要求的一級(jí)叫做第一范式(1NF),在第一范式的基礎(chǔ)上提出了第二范式(2NF),在第二范式的基礎(chǔ)上又提出了第三范式(3NF),以后又提出了BCNF范式,4NF, 5NF。范式的等級(jí)越高,應(yīng)滿足的約束集條件也越嚴(yán)格。規(guī)范的每一級(jí)別都依賴于它的前一級(jí)別,例如若一個(gè)關(guān)系模式滿足2NF,則一定滿足1NF。
13、下面我們只介紹 1NF, 2NF, 3NF范式。1.2. 1NF1NF是關(guān)系模型的最低要求,它的規(guī)則是:每一列必須是原子的,不能分成多個(gè)子列。每一行和列的位置只能有一個(gè)值。不能具有多值列。例:如果要求一個(gè)學(xué)生一行,一個(gè)學(xué)生可選多門課,則下面的“學(xué)生”表就不滿足1NF:student(s no,s name,class no)其中:s no 為學(xué)號(hào),s name 為學(xué)生姓名,class no 為課程號(hào)。因?yàn)橐粋€(gè)學(xué)生可選多門課,所以列class no 有多個(gè)值,所以空不符合1NF。規(guī)范化就是把它分成如下兩個(gè)表: “學(xué)生”表和“選課”表,則這兩個(gè)表就都滿足1NF 了。student(s no,s n
14、ame)stu class(s no,class no)1.3. 2NF對(duì)于滿足2NF 的表,除滿足1NF 外,非主碼的列必須依賴于所有的主碼,而不是組合主碼的一部分。如果滿足1NF 的表的主碼只有一列,則它自動(dòng)滿足2NF。例:下面的“選課”表,不符合2NF。stu class(s no,class no,class name)其中:class- name為課程名稱。因?yàn)樵~表的主碼是: (s no,class no),非主碼歹U class- name依賴于組合主碼的一部分class no,所以它不符合2NF。對(duì)該表規(guī)范化也是把它分解成兩個(gè)表: “選課”表和“課程”表,則它們就都滿足2NF 了
15、。stu class(s no,class no)class(class no,class name)1.4. 3NF3NF的規(guī)則是除滿足2NF外,任一非主碼列不能依賴于其它非主碼列。例:下面的“課程”表,不符合3NF。class(class no,class name,teacher no,teacher name)其中:teacher no 為任課教師號(hào),teacher name 為任課教師姓名。因?yàn)榉侵鞔a列teacher - name依賴于另一非主碼列teacher no,所以它不符合 3NF。其解決辦法也是把它分解成兩個(gè)表:“課程”表和“教師”表,則它們就都滿足3NF 了。class(
16、class no,class name,teacher no)teacher(teacher no,teacher name)1.5. 小結(jié)當(dāng)一個(gè)表是規(guī)范的,則其非主碼列依賴于主碼列。從關(guān)系模型的角度來(lái)看,表滿足3NF最符合標(biāo)準(zhǔn),這樣的設(shè)計(jì)容易維護(hù)。一個(gè)完全規(guī)范化的設(shè)計(jì)并不總能生成最優(yōu)的性能,因此通常是先按照3NF 設(shè)計(jì),如果有性能問(wèn)題,再通過(guò)反規(guī)范來(lái)解決。數(shù)據(jù)庫(kù)中的數(shù)據(jù)規(guī)范化的優(yōu)點(diǎn)是減少了數(shù)據(jù)冗余,節(jié)約了存儲(chǔ)空間,相應(yīng)邏輯和物理的 I/O 次數(shù)減少,同時(shí)加快了增、刪、改的速度,但是對(duì)完全規(guī)范的數(shù)據(jù)庫(kù)查詢,通常需要更多的連接操作,從而影響查詢的速度。因此, 有時(shí)為了提高某些查詢或應(yīng)用的性能而破
17、壞規(guī)范規(guī)則,即反規(guī)范。2. 數(shù)據(jù)的反規(guī)范2.1. 反規(guī)范的好處是否規(guī)范化的程度越高越好?這要根據(jù)需要來(lái)決定,因?yàn)椤胺蛛x”越深,產(chǎn)生的關(guān)系越多,關(guān)系過(guò)多,連接操作越頻繁,而連接操作是最費(fèi)時(shí)間的,特別對(duì)以查詢?yōu)橹鞯臄?shù)據(jù)庫(kù)應(yīng)用來(lái)說(shuō),頻繁的連接會(huì)影響查詢速度。所以,關(guān)系有時(shí)故意保留成非規(guī)范化的,或者規(guī)范化以后又反規(guī)范了,這樣做通常是為了改進(jìn)性能。例如帳戶系統(tǒng)中的 “帳戶” 表 B TB01,它的列busibalance(企業(yè)帳戶的總余額)就違反規(guī)范,其中的值可以通過(guò)下面的查詢獲得:select busi code,sum(acc balance)fromB TB06group by busi code
18、 如果B-TB01中沒(méi)有該列,若想獲得 businame(企業(yè)名稱)和企業(yè)帳戶的總余額,則需要做連接操作:select busi name,sum(acc balance)from B TB01,B TB06where B TB01.busi code=B TB06.busi codegroup by busi code如果經(jīng)常做這種查詢,則就有必要在B TB01中加入列busi balance,相應(yīng)的代價(jià)則是必須在表B TB06 上創(chuàng)建增、刪、改的觸發(fā)器來(lái)維護(hù)B TB01 表上busi balance 列的值。類似的情況在決策支持系統(tǒng)中經(jīng)常發(fā)生。反規(guī)范的好處是降低連接操作的需求、降低外碼和索
19、引的數(shù)目,還可能減少表的數(shù)目,相應(yīng)帶來(lái)的問(wèn)題是可能出現(xiàn)數(shù)據(jù)的完整性問(wèn)題。加快查詢速度,但會(huì)降低修改速度。因此決定做反規(guī)范時(shí),一定要權(quán)衡利弊,仔細(xì)分析應(yīng)用的數(shù)據(jù)存取需求和實(shí)際的性能特點(diǎn),好的索引和其它方法經(jīng)常能夠解決性能問(wèn)題,而不必采用反規(guī)范這種方法。2.2. 常用的反規(guī)范技術(shù)在進(jìn)行反規(guī)范操作之前,要充分考慮數(shù)據(jù)的存取需求、常用表的大小、一些特殊的計(jì)算(例如合計(jì))、數(shù)據(jù)的物理存儲(chǔ)位置等。常用的反規(guī)范技術(shù)有增加冗余列、增加派生列、重新組表和分割表。2.2.1. 增加冗余列增加冗余列是指在多個(gè)表中具有相同的列,它常用來(lái)在查詢時(shí)避免連接操作。例如前面例子中,如果經(jīng)常檢索一門課的任課教師姓名,則需要做c
20、lass和teacher表的連接查詢:select class name,teacher namefrom class,teacherwhereclass.teacher no=teacher.teacher no這樣的話就可以在 class表中增加一列teacher name就不需要連接操作了。增加冗余列可以在查詢時(shí)避免連接操作,但它需要更多的磁盤空間,同時(shí)增加表維護(hù)的工作量。2.2.2. 增加派生列增加派生列指增加的列來(lái)自其它表中的數(shù)據(jù),它的作用是在查詢時(shí)減少連接操作,避免使用集函數(shù)。例如前面所講的賬戶系統(tǒng)中的表balance 就是派生列。派生列也具有與冗余列同樣的缺點(diǎn)。B TB01 的列
21、busi2.2.3. 重新組表重新組表指如果許多用戶需要查看兩個(gè)表連接出來(lái)的結(jié)果數(shù)據(jù),則把這兩個(gè)表重新組成一個(gè)表來(lái)減少連接而提高性能。例如,用戶經(jīng)常需要同時(shí)查看課程號(hào),課程名稱,任課教 師 號(hào) , 任 課 教 師 姓 名 , 則 可 把 表 class(class no,class name,teacher no) 和 表 teacher(teacher no,teacher name) 合并成一個(gè)表class(class no,class name,teacher no,teacher name)。 這樣可提高性能,但需要更多的磁盤空間,同時(shí)也損失了數(shù)據(jù)在概念上的獨(dú)立性。2.2.4. 分割表
22、有時(shí)對(duì)表做分割可以提高性能。表分割有兩種方式:1 水平分割:根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到兩個(gè)獨(dú)立的表中。水平分割通常在下面的情況下使用:A 表很大,分割后可以降低在查詢時(shí)需要讀的數(shù)據(jù)和索引的頁(yè)數(shù), 同時(shí)也降低了索引的層數(shù),提高查詢速度。B 表中的數(shù)據(jù)本來(lái)就有獨(dú)立性,例如表中分別記錄各個(gè)地區(qū)的數(shù)據(jù)或不同時(shí)期的數(shù)據(jù),特別是有些數(shù)據(jù)常用,而另外一些數(shù)據(jù)不常用。C 需要把數(shù)據(jù)存放到多個(gè)介質(zhì)上。例如法規(guī)表law 就可以分成兩個(gè)表active law 和inactive law。 activea authors 表中的內(nèi)容是正生效的法規(guī),是經(jīng)常使用的,而 inactive law表則使已經(jīng)作廢的法規(guī)
23、,不常被查詢。水平分割會(huì)給應(yīng)用增加復(fù)雜度,它通常在查詢時(shí)需要多個(gè)表名,查詢所有數(shù)據(jù)需要union 操作。在許多數(shù)據(jù)庫(kù)應(yīng)用中,這種復(fù)雜性會(huì)超過(guò)它帶來(lái)的優(yōu)點(diǎn),因?yàn)橹灰饕P(guān)鍵字不大,則在索引用于查詢時(shí),表中增加兩到三倍數(shù)據(jù)量,查詢時(shí)也就增加讀一個(gè)索引層的磁盤次數(shù)。2 垂直分割:把主碼和一些列放到一個(gè)表,然后把主碼和另外的列放到另一個(gè)表中。如果一個(gè)表中某些列常用,而另外一些列不常用,則可以采用垂直分割,另外垂直分割可以使得數(shù)據(jù)行變小,一個(gè)數(shù)據(jù)頁(yè)就能存放更多的數(shù)據(jù),在查詢時(shí)就會(huì)減少I/O 次數(shù)。其缺點(diǎn)是需要管理冗余列,查詢所有數(shù)據(jù)需要join 操作。3. 反規(guī)范技術(shù)需要維護(hù)數(shù)據(jù)的完整性無(wú)論使用何種反規(guī)
24、范技術(shù),都需要一定的管理來(lái)維護(hù)數(shù)據(jù)的完整性,常用的方法是批處理維護(hù)、應(yīng)用邏輯和觸發(fā)器。批處理維護(hù)是指對(duì)復(fù)制列或派生列的修改積累一定的時(shí)間后, 運(yùn)行一批處理作業(yè)或存儲(chǔ)過(guò)程對(duì)復(fù)制或派生列進(jìn)行修改,這只能在對(duì)實(shí)時(shí)性要求不高的情況下使用。數(shù)據(jù)的完整性也可由應(yīng)用邏輯來(lái)實(shí)現(xiàn),這就要求必須在同一事務(wù)中對(duì)所有涉及的表進(jìn)行增、刪、改操作。用應(yīng)用邏輯來(lái)實(shí)現(xiàn)數(shù)據(jù)的完整性風(fēng)險(xiǎn)較大,因?yàn)橥贿壿嫳仨氃谒械膽?yīng)用中使用和維護(hù),容易遺漏,特別是在需求變化時(shí),不易于維護(hù)。另一種方式就是使用觸發(fā)器,對(duì)數(shù)據(jù)的任何修改立即觸發(fā)對(duì)復(fù)制列或派生列的相應(yīng)修改。觸發(fā)器是實(shí)時(shí)的,而且相應(yīng)的處理邏輯只在一個(gè)地方出現(xiàn),易于維護(hù)。一般來(lái)說(shuō),是解決
25、這類問(wèn)題的最好的辦法。4. 結(jié)束語(yǔ)數(shù)據(jù)庫(kù)的反規(guī)范設(shè)計(jì)可以提高查詢性能。常用的反規(guī)范技術(shù)有增加冗余列、增加派生列、 重新組表和分割表。但反規(guī)范技術(shù)需要維護(hù)數(shù)據(jù)的完整性。因此在做反規(guī)范時(shí),一定要權(quán)衡利弊,仔細(xì)分析應(yīng)用的數(shù)據(jù)存取需求和實(shí)際的性能特點(diǎn)。Oracle 數(shù)據(jù)庫(kù)設(shè)計(jì)階段性能優(yōu)化策略通過(guò)對(duì) Oracle 數(shù)據(jù)庫(kù)系統(tǒng)物理結(jié)構(gòu)和邏輯結(jié)構(gòu)的分析,闡述了在Oralce 數(shù)據(jù)庫(kù)設(shè)計(jì)開(kāi)發(fā)階段性能優(yōu)化的一些策略和方法。Oracle 是目前使用最為廣泛的大型數(shù)據(jù)庫(kù)管理系統(tǒng),提高Oracle 數(shù)據(jù)庫(kù)系統(tǒng)的運(yùn)行效率,是整個(gè)計(jì)算機(jī)信息系統(tǒng)高效運(yùn)轉(zhuǎn)的前提和保證。影響Oracle 數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)性能的因素很多,既有軟件
26、方面的因素,也包括數(shù)據(jù)運(yùn)行的硬件環(huán)境、網(wǎng)絡(luò)環(huán)境、數(shù)據(jù)庫(kù)管理和維護(hù)方面的因素等。數(shù)據(jù)庫(kù)系統(tǒng)設(shè)計(jì)開(kāi)發(fā)階段是Oracle 應(yīng)用優(yōu)化的最佳階段,也是主動(dòng)優(yōu)化階段, 能達(dá)到以最小成本獲得最大性能增益的目的。通過(guò)對(duì)其邏輯存儲(chǔ)結(jié)構(gòu)和物理存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)進(jìn)行優(yōu)化,使之在滿足需求條件下,時(shí)空開(kāi)銷性能最佳,可以解決數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行過(guò)程中性能的漸進(jìn)性下降或性能突降等問(wèn)題,以保證系統(tǒng)運(yùn)行的優(yōu)良性能。Oracle 數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)Oracle 數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)是由一些數(shù)據(jù)庫(kù)對(duì)象組成,如數(shù)據(jù)庫(kù)表空間、表、索引、段、視圖、存儲(chǔ)過(guò)程、觸發(fā)器等。數(shù)據(jù)庫(kù)的邏輯存儲(chǔ)結(jié)構(gòu)(表空間等)決定了數(shù)據(jù)庫(kù)的物理空間是如何被使用的,數(shù)據(jù)庫(kù)對(duì)
27、象如表、索引等分布在各個(gè)表空間中。Oracle 數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)從操作系統(tǒng)一級(jí)查看,是由一個(gè)個(gè)的文件組成,從物理上可劃分為:數(shù)據(jù)文件、日志文件、控制文件和參數(shù)文件。數(shù)據(jù)文件中存放了所有的數(shù)據(jù)信息日志文件存放數(shù)據(jù)庫(kù)運(yùn)行期間產(chǎn)生的日志信息,它被重復(fù)覆蓋使用,若不采用歸檔方式的話,已被覆蓋的日志信息將無(wú)法恢復(fù);控制文件記錄了整個(gè)數(shù)據(jù)庫(kù)的關(guān)鍵結(jié)構(gòu)信息,它若被破壞,整個(gè)數(shù)據(jù)庫(kù)將無(wú)法工作和恢復(fù);參數(shù)文件中設(shè)置了很多Oracle 數(shù)據(jù)庫(kù)的配置參數(shù),當(dāng)數(shù)據(jù)庫(kù)啟動(dòng)時(shí),會(huì)讀取這些信息。邏輯結(jié)構(gòu)的優(yōu)化邏輯結(jié)構(gòu)優(yōu)化用通俗的話來(lái)說(shuō)就是通過(guò)增加、減少或調(diào)整邏輯結(jié)構(gòu)來(lái)提高應(yīng)用的效率,下面通過(guò)對(duì)基本表的設(shè)計(jì)及索引、聚簇的討論
28、來(lái)分析ORACL那輯結(jié)構(gòu)的優(yōu)化。1、基本表擴(kuò)展:數(shù)據(jù)庫(kù)性能包括存儲(chǔ)空間需求量的大小和查詢響應(yīng)時(shí)間的長(zhǎng)短兩個(gè)方面。為了優(yōu)化數(shù)據(jù)庫(kù)性能,需要對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行規(guī)范化。一般來(lái)說(shuō),邏輯數(shù)據(jù)庫(kù)設(shè)計(jì)滿足第三范式的表結(jié)構(gòu)容易維護(hù)且基本滿足實(shí)際應(yīng)用的要求。所以, 實(shí)際應(yīng)用中一般都按照第三范式的標(biāo)準(zhǔn)進(jìn)行規(guī)范化,從而保證了數(shù)據(jù)庫(kù)的一致性和完整性,設(shè)計(jì)人員往往會(huì)設(shè)計(jì)過(guò)多的表間關(guān)聯(lián),以盡可能地降低數(shù)據(jù)冗余。但在實(shí)際應(yīng)用中這種做法有時(shí)不利于系統(tǒng)運(yùn)行性能的優(yōu)化:如過(guò)程從多表獲取數(shù)據(jù)時(shí)引發(fā)大量的連接操作,在需要部分?jǐn)?shù)據(jù)時(shí)要掃描整個(gè)表等,這都消耗了磁盤的 I/O 和 CPU 時(shí)間。為解決這一問(wèn)題,在設(shè)計(jì)表時(shí)應(yīng)同時(shí)考慮對(duì)某些表
29、進(jìn)行反規(guī)范化,方法有以下幾種:一是分割表。分割表可分為水平分割表和垂直分割表兩種:水平分割是按照行將一個(gè)表分割為多個(gè)表,這可以提高每個(gè)表的查詢速度,但查詢、更新時(shí)要選擇不同的表,統(tǒng)計(jì)時(shí)要匯總多個(gè)表, 因此應(yīng)用程序會(huì)更復(fù)雜。垂直分割是對(duì)于一個(gè)列很多的表,若某些列的訪問(wèn)頻率遠(yuǎn)遠(yuǎn)高于其它列,就可以將主鍵和這些列作為一個(gè)表,將主鍵和其它列作為另外一個(gè)表。通過(guò)減少列的寬度,增加了每個(gè)數(shù)據(jù)頁(yè)的行數(shù),一次I/O 就可以掃描更多的行,從而提高了訪問(wèn)每一個(gè)表的速度。但是由于造成了多表連接,所以應(yīng)該在同時(shí)查詢或更新不同分割表中的列的情況比較少的情況下使用。二是保留冗余列。當(dāng)兩個(gè)或多個(gè)表在查詢中經(jīng)常需要連接時(shí),可以
30、在其中一個(gè)表上增加若干冗余的列,以避免表之間的連接過(guò)于頻繁,一般在冗余列的數(shù)據(jù)不經(jīng)常變動(dòng)的情況下使用。三是增加派生列。派生列是由表中的其它多個(gè)列的計(jì)算所得,增加派生列可以減少統(tǒng)計(jì)運(yùn)算,在數(shù)據(jù)匯總時(shí)可以大大縮短運(yùn)算時(shí)間。因此, 在數(shù)據(jù)庫(kù)的設(shè)計(jì)中,數(shù)據(jù)應(yīng)當(dāng)按兩種類別進(jìn)行組織:頻繁訪問(wèn)的數(shù)據(jù)和頻繁修改的數(shù)據(jù)。對(duì)于頻繁訪問(wèn)但是不頻繁修改的數(shù)據(jù),內(nèi)部設(shè)計(jì)應(yīng)當(dāng)物理不規(guī)范化。對(duì)于頻繁修改但并不頻繁訪問(wèn)的數(shù)據(jù),內(nèi)部設(shè)計(jì)應(yīng)當(dāng)物理規(guī)范化。有時(shí)還需將規(guī)范化的表作為邏輯數(shù)據(jù)庫(kù)設(shè)計(jì)的基礎(chǔ),然后再根據(jù)整個(gè)應(yīng)用系統(tǒng)的需要,物理地非規(guī)范化數(shù)據(jù)。規(guī)范與反規(guī)范都是建立在實(shí)際的操作基礎(chǔ)之上的約束,脫離了實(shí)際兩者都沒(méi)有意義。只有把兩
31、者合理地結(jié)合在一起,才能相互補(bǔ)充,發(fā)揮各自的優(yōu)點(diǎn)。2、索引和聚簇:創(chuàng)建索引是提高檢索效率最有效的方法之一,索引把表中的邏輯值映射到安全的RowID,能快速定位數(shù)據(jù)的物理地址,可以大大加快數(shù)據(jù)庫(kù)的查詢速度,一個(gè)建有合理索引的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)可能比一個(gè)沒(méi)有建立索引的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)效率高幾十倍,但并不是索引越多越好,在那些經(jīng)常需要修改的數(shù)據(jù)列上建立索引,將導(dǎo)致索引B*樹(shù)的不斷重組,造成系統(tǒng)性能的下降和存儲(chǔ)空間的浪費(fèi)。對(duì)于一個(gè)大型表建立的索引,有時(shí)并不能改善數(shù)據(jù)查詢速度,反而會(huì)影響整個(gè)數(shù)據(jù)庫(kù)的性能。這主要是和SGA的數(shù)據(jù)管理方式有關(guān),Oracle在進(jìn)行數(shù)據(jù)塊高速緩存管理時(shí),索引數(shù)據(jù)比普通數(shù)據(jù)具有更高的駐
32、留權(quán)限,在進(jìn)行空間競(jìng)爭(zhēng)時(shí),Oracle 會(huì)先移出普通數(shù)據(jù),對(duì)建有索引的大型表進(jìn)行數(shù)據(jù)查詢時(shí),索引數(shù)據(jù)可能會(huì)用完所有的數(shù)據(jù)塊緩存空間,Oracle 不得不頻繁地進(jìn)行磁盤讀寫來(lái)獲取數(shù)據(jù),所以,在對(duì)一個(gè)大型表進(jìn)行分區(qū)之后,可以根據(jù)相應(yīng)的分區(qū)建立分區(qū)索引。Oracle提供了另一種方法來(lái)提高查詢速度,就是聚簇 (Cluster)。所謂聚簇,簡(jiǎn)單地說(shuō)就是把幾個(gè)表放在一起,按一定公共屬性混合存放。聚簇根據(jù)共同碼值將多個(gè)表的數(shù)據(jù)存儲(chǔ)在同一個(gè) Oracle 塊中,這時(shí)檢索一組Oracle 塊就同時(shí)得到兩個(gè)表的數(shù)據(jù),這樣就可以減少需要存儲(chǔ)的Oracle塊,從而提高應(yīng)用程序的性能。對(duì)于邏輯結(jié)構(gòu)的優(yōu)化,還應(yīng)將表數(shù)據(jù)和索引數(shù)據(jù)分開(kāi)表空間存儲(chǔ),分別使用獨(dú)立的表空間。因?yàn)槿绻麑⒈頂?shù)據(jù)和索引數(shù)據(jù)放在一起,表數(shù)據(jù)的I/O 操作和索引的I/O 操作將產(chǎn)生影響系統(tǒng)性能的I/O 競(jìng)爭(zhēng), 降
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《基于蟻群算法的港口貨物配送車輛調(diào)度優(yōu)化研究》
- 二零二五年度股權(quán)分配與企業(yè)發(fā)展協(xié)議3篇
- 《堇菜屬兩型花的繁殖特性及對(duì)異質(zhì)生境的繁殖響應(yīng)》
- 二零二五年度班組養(yǎng)老機(jī)構(gòu)護(hù)理服務(wù)勞務(wù)協(xié)議2篇
- 二零二五年度醫(yī)院病房窗簾更換承包工程3篇
- 2024智能語(yǔ)音交互系統(tǒng)研發(fā)與實(shí)施合同
- 2019-2025年中國(guó)商務(wù)禮品行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略咨詢報(bào)告
- 2024生活垃圾清運(yùn)、處理與廢棄物資源化利用專項(xiàng)合同6篇
- 2024年簽訂:高端制造設(shè)備進(jìn)口租賃合同
- 2024年版攝影棚布光中介服務(wù)合同3篇
- 完整版:美制螺紋尺寸對(duì)照表(牙數(shù)、牙高、螺距、小徑、中徑外徑、鉆孔)
- TCI 373-2024 中老年人免散瞳眼底疾病篩查規(guī)范
- 2024四川太陽(yáng)能輻射量數(shù)據(jù)
- 石油鉆采專用設(shè)備制造考核試卷
- 法人變更股權(quán)轉(zhuǎn)讓協(xié)議書(2024版)
- 研究生中期考核匯報(bào)模板幻燈片
- AQ/T 2061-2018 金屬非金屬地下礦山防治水安全技術(shù)規(guī)范(正式版)
- 培訓(xùn)機(jī)構(gòu)與學(xué)校合作協(xié)議書范本
- 留置導(dǎo)尿法操作評(píng)分標(biāo)準(zhǔn)
- 2024年高考數(shù)學(xué)經(jīng)典解答題-立體幾何專項(xiàng)復(fù)習(xí)17題(附答案)
- 麻醉管理-血?dú)夥治鲈谑中g(shù)中的應(yīng)用
評(píng)論
0/150
提交評(píng)論