陳紅艷
摘要:文章指出,數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)時(shí)任何一個(gè)應(yīng)用系統(tǒng)運(yùn)行的支撐,是整個(gè)應(yīng)用系統(tǒng)的基礎(chǔ),在設(shè)計(jì)過(guò)程中結(jié)構(gòu)設(shè)計(jì)存在缺陷,那么相對(duì)其進(jìn)行調(diào)整只通過(guò)數(shù)據(jù)庫(kù)的參數(shù)是遠(yuǎn)遠(yuǎn)不夠的。通常來(lái)講,需要清除用戶(hù)復(fù)雜表的結(jié)構(gòu)以及表中這樣的表的大小,從而拆開(kāi)幾個(gè)有關(guān)系的表結(jié)構(gòu)。不能單單將用戶(hù)標(biāo)原封不動(dòng)地進(jìn)行轉(zhuǎn)換,這樣的行為方式是非常不明智的。
關(guān)鍵詞:數(shù)據(jù)庫(kù)邏輯設(shè)計(jì);表;主鍵;字段及類(lèi)型
在Oracle應(yīng)用中,除了影響性能的大都是系統(tǒng)的配置參數(shù)等原因外,影響應(yīng)用系統(tǒng)性能的另一個(gè)原因是應(yīng)用程序的編寫(xiě)不當(dāng)。因而,調(diào)整應(yīng)用程序也是改善性能的一個(gè)方面。
在對(duì)系統(tǒng)分析這個(gè)階段中,需要有工作經(jīng)驗(yàn)的分析員以及編程人員跟客戶(hù)一起討論商量。這個(gè)過(guò)程所需要做的工作就是聆聽(tīng)客戶(hù)的需求。當(dāng)全面理解客戶(hù)的初步需求之后,就需要分析員將客戶(hù)的這些需求以文檔的形式進(jìn)行歸檔,即是將數(shù)據(jù)的需求定義編寫(xiě)。然后根據(jù)E R圖進(jìn)行邏輯設(shè)計(jì)。設(shè)計(jì)應(yīng)盡量遵循如下原則。
1主鍵字段的正確選擇
在對(duì)主鍵字段選擇的時(shí)候,對(duì)其要求是非常重視的,要求其不能有重復(fù)的值現(xiàn)象發(fā)生,對(duì)于留空的一定要杜絕發(fā)生,這是主鍵選段的最基礎(chǔ)的要求。在這過(guò)程中還需要注意以下幾個(gè)方面內(nèi)容:(1)主鍵的選擇不能采用單位形式,不能過(guò)長(zhǎng)的采用列值。(2)主鍵的選擇建議采用字符或者數(shù)型。(3)不能使用類(lèi)似日期、浮點(diǎn)之類(lèi)的形式。(4)使用過(guò)程中出現(xiàn)主鍵重復(fù),那么可以選擇2個(gè)字段作主鍵,但是不推薦使用3個(gè)以上作為主鍵。
2字段類(lèi)型以及長(zhǎng)度的選擇
在設(shè)計(jì)的過(guò)程中,每個(gè)設(shè)計(jì)者的思維是不同的,在一個(gè)字段的表示上,不同的設(shè)計(jì)者給出的結(jié)果是不相同的,有時(shí)候定義的字段其實(shí)際意義各不相同。在這個(gè)程度上,目前的理論內(nèi)容還沒(méi)有完全給出一個(gè)定義來(lái)定義這種現(xiàn)象,所以,眾多人表示只要字段能夠滿足客戶(hù)要求就行。其實(shí)面對(duì)一個(gè)比較復(fù)雜的應(yīng)用系統(tǒng),在定義字段過(guò)程中需要考慮的變化因素是眾多的。筆者經(jīng)過(guò)多年實(shí)際工作經(jīng)驗(yàn)對(duì)應(yīng)用以及設(shè)計(jì)進(jìn)行分析,以供同行參考。
2.1如果能用字符型就不要用數(shù)字型
在設(shè)計(jì)過(guò)程,有很多的地方、很多字段都是可以用字符型以及數(shù)字型進(jìn)行表示,例如,工作員的身份證號(hào)。其內(nèi)容基本上都是以數(shù)字組成。身份證的每一個(gè)部位都包含特殊的含義,其在輸入以及查詢(xún)的過(guò)程中都會(huì)有一套嚴(yán)密的核查方法。例如:最后一位表示男(1)或女(2)。當(dāng)用字符型時(shí),可以在輸入中用where substr(per_id,15,1)=l'orsubstr(per_id,15,1)=2來(lái)檢查數(shù)據(jù)的正確性。如果采用數(shù)字這樣的判斷就不那么容易了。
2.2運(yùn)算過(guò)程需求一致
在定義字段的過(guò)程中,除了要求數(shù)字型能夠容納日后也許變化的數(shù)據(jù)之外,還有一部分內(nèi)容是值得重視的,即在可能參加運(yùn)算的字段中,其長(zhǎng)度和精度必須是保持一致的。
這樣的處理方法,看上去會(huì)在一定程度上浪費(fèi)空間,但是,沒(méi)有必要去擔(dān)心空間的使用程度,因?yàn)?,假設(shè)其長(zhǎng)度以及精度相差不齊,那么在運(yùn)算過(guò)程中容易有算錯(cuò)的結(jié)果出現(xiàn)。
例如,可以采取PRO*C進(jìn)行編程工作。當(dāng)表內(nèi)的數(shù)字字段的定義發(fā)生變量的時(shí)候,C編譯不會(huì)去檢查其中一致性的關(guān)系。舉個(gè)例子說(shuō)明:在表里面字段顯得大,而在C語(yǔ)言中能夠說(shuō)明其小,當(dāng)將表中的字段取出放到表量的過(guò)程中,語(yǔ)言沒(méi)有提示錯(cuò)誤的現(xiàn)象發(fā)生。在不經(jīng)過(guò)任何轉(zhuǎn)換的形式下進(jìn)行運(yùn)算,就會(huì)有不同的結(jié)果產(chǎn)生。
2.3不能為節(jié)省空間隨意拆開(kāi)字節(jié)
隨著科技的迅猛發(fā)展,目前的儲(chǔ)存硬件的發(fā)展進(jìn)步是相當(dāng)快的,在當(dāng)前的應(yīng)用設(shè)計(jì)階段不要講以往教科書(shū)里面的理論帶到現(xiàn)在的環(huán)境中。這里所說(shuō)的是指,實(shí)際的用戶(hù)需要就是字段的長(zhǎng)度需要。比如,有人經(jīng)常將日期分成3個(gè)字段來(lái)定義,可能寫(xiě)nian char(2),即2位的年;yue char(1)即1位的月,ri char(2),2位的日。這樣在年份只能存放2位,2000年存為00,2001年存為01;而月份就不同了,設(shè)計(jì)者要求用戶(hù)1月輸入成1,2月輸入成2,…而10月輸入成a;11月輸入成b等。
這種設(shè)計(jì)形式好像節(jié)省了很多的空間,但實(shí)際上也沒(méi)有節(jié)省多少,一條記錄節(jié)省的也就是2個(gè)字節(jié),那么成千上萬(wàn)條的記錄也不過(guò)節(jié)省幾十兆字節(jié)而己,這樣的處理方式只會(huì)給程序的處理增加時(shí)間,對(duì)于優(yōu)化和未來(lái)的移植是起到阻礙作用的。
2.4將LOB類(lèi)型的字段與其它的類(lèi)型分開(kāi)
Oracle8i提供了許多可以用于存儲(chǔ)大對(duì)象數(shù)據(jù)的類(lèi)型,如LONG,LONG RAW等。從性能的角度考慮出發(fā),建議在設(shè)計(jì)表格的時(shí)候?qū)⒛切┫鄬?duì)較大的對(duì)象跟其他種類(lèi)的數(shù)據(jù)分開(kāi)儲(chǔ)存。比如職工的檔案證件這些東西,職工檔案其內(nèi)容包含有一些關(guān)于職工的基本情況、相片之類(lèi)的東西,在設(shè)計(jì)過(guò)程需要將這些信息與職工的信息進(jìn)行分割,最后采取關(guān)鍵字段進(jìn)行連接處理。
3采用具有編碼的設(shè)計(jì)方法
在對(duì)多處使用值采用編碼設(shè)計(jì)的階段里,類(lèi)似員工的單位名稱(chēng)這個(gè)部位,因?yàn)閱T工的里面包含的員工很多,假設(shè)在記錄過(guò)程將每個(gè)員工的單位都進(jìn)行記錄,那么就會(huì)出現(xiàn)傳說(shuō)中的冗余現(xiàn)象。編碼大概是劃分為2中,排除剛才敘述的一種之外,還需要考慮另外一種,考慮一些應(yīng)用使用性能方便的應(yīng)用。比如,銀行存款系統(tǒng)的應(yīng)用,這個(gè)設(shè)計(jì)過(guò)程可以考慮考法一款(交易代碼)的程序代碼。分別用(存入、取出、結(jié)息)這3個(gè)步驟表示,可以將該字段取名為:
tran_code char(1) check(tran code'1,ortran code=2or tran code=3),
在設(shè)計(jì)操作處理界時(shí),只有3種步驟供使用者選用,即“存入”“取出”“結(jié)息”3種選擇,這樣可以避免讓操作員直接輸入字符所帶來(lái)的不一致等的問(wèn)題。
在Oracle系統(tǒng)里,提供了功能特別的decode函數(shù)。使用它可以在性能上得到特別的效果。這樣使用的前提是,先在建立表結(jié)構(gòu)時(shí)就需要將該列描述為較短的寬度。然后在SQL語(yǔ)句中來(lái)使用它。如:銀行的活期存款表結(jié)構(gòu),可以對(duì)借貸字段存入或取出。
4建立公共字典表
除了以上提到的建立代碼的方法外,在現(xiàn)實(shí)設(shè)計(jì)中還有一種使用較為廣泛的方式,就是對(duì)象數(shù)據(jù)字典的建立,其與Oracle系統(tǒng)的數(shù)據(jù)字典類(lèi)似。應(yīng)用系統(tǒng)的數(shù)據(jù)字典也是為了各個(gè)對(duì)象的命名標(biāo)準(zhǔn)而采用的方法。凡是表名、索引名、表中的列名以及過(guò)程所用名稱(chēng)等最好以數(shù)據(jù)字典的方式在數(shù)據(jù)庫(kù)建立。這樣可以讓Oracle系統(tǒng)幫助人們檢查。在一個(gè)新的對(duì)象需要建立命名的時(shí)候,需要將其設(shè)立在這個(gè)字典里面。這里需要和客戶(hù)取得溝通后才能進(jìn)行下一步工作,在對(duì)討論出來(lái)的結(jié)果認(rèn)定后就不能隨便更改,但是遇到非要更改的情況時(shí),一定要經(jīng)過(guò)DBA的同意并且備案才能修改。另外一個(gè)建議是建立過(guò)程要控制兩者不能建立相同的名字,為了做好這一點(diǎn),建議先將各種關(guān)鍵字放到一個(gè)表格里面,在建立時(shí)候再進(jìn)行比對(duì),以這樣的方式很好地避開(kāi)重復(fù)。
5哪種類(lèi)型的表設(shè)為cache方式
Oracle提供了一種方法,可以將表的數(shù)據(jù)駐留在內(nèi)存的SGA區(qū)內(nèi),這叫做緩存(cache)。一般來(lái)說(shuō),對(duì)于在應(yīng)用中那些數(shù)據(jù)量不大、被頻繁訪問(wèn)的表,應(yīng)該將其設(shè)置成緩存方式,這樣在數(shù)據(jù)庫(kù)啟動(dòng)完成后被說(shuō)明為緩存的表的數(shù)據(jù)就被系統(tǒng)讀到SGA區(qū)中了??梢杂肁lter table或Create table命令上加cache子句使表成為緩存表(一直放在SGA區(qū)內(nèi)不被清除)。
如:alter table ACCOUNT_CODE cache;
如果不需要緩存而取消緩存設(shè)置可用nocache來(lái)完成。如:alter ACCTOUNT_CODE nocache;
例:在建表時(shí)將表設(shè)置成緩存的方式:
SQL>CREATE table phone_1st
(employee Id number,
phone_no varchar2(15),
extension varchar2(5)
)tablespace users
storage(INITIAL 1m next 500k pctincrease 0)
CACHE;
對(duì)于已經(jīng)將表設(shè)置成Cache的信息,可以從DBA_TABLES字典中查到,如:
SQL>select owner,table_name from dba_tables
Where LTRIM(cache)=Y;
6結(jié)語(yǔ)
正確地對(duì)數(shù)據(jù)庫(kù)表進(jìn)行設(shè)計(jì),直接關(guān)乎到每個(gè)用戶(hù)的切身利益,也直接影響到企業(yè)的效益。所以需要合理科學(xué)的設(shè)計(jì)數(shù)據(jù)庫(kù)中的表,提高系統(tǒng)的性能。