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