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