ORACLE數據庫中表是最基本的內容可以說表設計的好壞直接跟數據庫的性能相關所以在設計表的時候除了要遵循其固有的數據庫准則之外還需要看個人的數據庫管理經驗下面我就把這些經驗分享一下或許對大家有所幫助
一 表該存放在哪裡?
我們都知道在ORACLE數據庫中使利用空間這個概念來管理表對象的在數據庫創建的時候數據庫中已經建立了一些表空間那麼當我們新建立表的時候這個新表的位置該放在什麼地方呢?這就好像吃飯時的坐的位置一樣是有講究的一般來說我們在新建表的時候至少要遵循如下建議
一是在數據庫創建的時候在數據庫中已經有了一個SYSTEM的表空間一般情況下這個表空間中只包含數據字典及Oracle系統對象如果我們將我們的表建立在這個空間上的話那是要降低數據庫的性能的所以一般我們是不建議用戶把表格建立在這個空間上但是若我們不只一個人維護數據庫如有八個人共同設計數據庫系統時如何才能保證其他用戶不在SYSTEM表空間中建立數據庫表格呢?最好的辦法就是通過權限控制如我們可以給每個數據庫設計人員指定一個默認的表空間讓他們只能在這個表空間中建立表格如此的話就能防止他們在SYSTEM表空間中建立自己的數據表格從而對數據庫的運行性能產生不良影響所以若給每個用戶設置默認表空間的話那麼用戶在建立具體的表時不用具體指定表空間了
二是我們在為某個應用設計數據庫的時候最好先對表的空間進行規劃一般情況下不要把數據表隨意的分散到不同的表空間中去如我們在為一個ERP系統設計數據庫的時候若把采購部門相關的表跟銷售部門相關的表放到兩個不同的表空間中去這是不明智的做法這麼處理的話會降低某些數據庫管理和維護操作的效率如數據的備份與恢復操作;而且也無法集中管理屬於某個特定應用的數據所以我們一般建議在規劃數據庫表空間的時候把相同應用的表放在同一個表空間中去如果要區分不同部門或者不同模塊的表的話我們可以在表的命名上動腦子如我們在設計ERP系統的數據庫中可以根據其應用模塊的不同在前面加上前綴來進行識別如跟系統基本配置相關的表我們可以用AD為前綴;而跟銷售部門相關的表我們可以加上SA前綴等等如此的話這些表具體是屬於哪個模塊的就一清二楚了完全沒有必要為此設置不同的表空間這是ORACLE數據庫初學者經常會犯的錯誤主要是對ORACLE表空間的定義不是很熟悉所導致的
二 對預計存儲數量比較大的表時要給與額外的重視
有些表非常的大我們這邊說的大不一定是說結構復雜而是指在這個表格中預期會存儲比較多的數據為了提高對這個表格的處理效率我們在事先要做出一定的安排否則的話後續對這些大表進行查詢插入等操作的話速度會很慢所以我們就有必要在數據庫設計的時候先預先估計一下表的數據存儲量把一些數據量大的表格做一些額外的設置如在ERP軟件的數據庫設置中一般來說產品數據與物料清單數據這兩個表的數據量會比較大;而從長遠看的話銷售訂單采購訂單生產訂單記賬憑證等這種單據類相關的表格其數據量也會比較大一年兩年可能感覺不出來但是到十年後這個紀錄數量就會很龐大而像ERP系統這種大型的信息化管理項目用個幾十年時很正常的事情而且為了記錄的完整性也不建議用戶把以前的數據刪除所以為這種應用進行數據庫設計的時候要充分考慮這些大表的性能問題
具體的來說設計大表的時候可以考慮遵循如下的建議
一是不要為大表設置存儲的限制在ORACLE數據庫中可以為每張表格設置存儲配額限制如此的話表最大容量就不能超過這個限制對於一些數據容量比較小的表格這麼設置時合理的可以提高空間的利用率但是若數據量比較大的話就不建議事先設置表的存儲空間了如ERP系統的銷售訂單表其剛開始可能記錄量很小第一年預計只有G的記錄容量但是估計在十年後這個記錄容量就會達到G了在這種情況下我們怎麼來給其設置存儲空間呢?一開就設置G空間這也是不合理的而且設置存儲空間就意味著有可能產生存儲碎片從而影響到數據查詢的效率所以在數據庫表的設計過程中若某些應用的表可能會有比較大的數據容量時建議不要對其存儲空間做出任何的限制
二是要為這大表分配足夠的臨時空間如我們使用ERP系統時要查詢產品資料信息我們都知道產品信息的話有些企業這個紀錄數非常的龐大而且在查詢時我們還會經常的進行排序操作如有時候會按照產品編碼對查詢出來的數據進行排序當記錄少的話還好;但是當記錄多的話這個排序動作要求具有比較大的臨時存儲空間所以當某個表預計會有很大的記錄數量的時候我們就要給其分配足夠多的臨時空間臨時空間的存儲參數設置取決於臨時表空間的默認儲存參數設置我們可以更改這些參數以達到我們對要求若沒有給大表分配足夠多的臨時空間的話則排序的動作將會很慢而且很可能不成功
三是要考慮將表與表的索引分離存放大表所對應的索引通常也比較大一般來說索引的數量是隨著表記錄的數量增加而增加兩者是接近於一個正比例的關系所以通常表的記錄容量大的時候索引數量也會很龐大針對這種情況我們考慮突破我們上面講的表空間的規則定義而考慮把表和他的索引分別存儲於不同的表空間中甚至在條件允許的情況下分別存儲於不同的硬盤中這麼做的好處是什麼呢?最大的好處是讓索引比較容易的獲得所需要的連續的存儲空間從而提高輸入輸入的效率通俗的說就是可以提高數據的查詢效率如不這麼處理的話查詢大容量的記錄的話數據庫可能需要花費秒;而如此設計的話就可能把時間縮短為秒這是一個很明顯的性能改善
三 如何給表命名?
上面我在講如何為表分配存儲空間的時候已經講到過這方面的問題下面我就將對這個問題進行詳細的描述以幫助數據庫管理員掌握一套好的數據庫命名規則
首先毋庸置疑的在為標命名的時候要遵循ORACLE數據庫的基本命名規則如不能以數字開頭為表命名如不能利用數據庫的關鍵字為表命名如表的名字不能重復等等這些是最基本的要求就不用我多費口舌了除了要遵循這些基本的命名規則外在實際工作中為了數據庫後續的維護等方面出發我們還是要遵循一些額外的規則這些規則跟ORACLE定義的規則不同我們所講的規則沒有約束力可以說只是業界的一些共識而已你若不怎麼處理ORACLE數據庫也不會說你錯誤只是後續維護的時候會比較麻煩而已
一是在對數據庫命名的時候最好能跟體現表的分類關系如最常見的我們在設計數據庫的時候表都是按系統的具體模塊來區分的如根據前端系統要求的不同數據庫的表大致可以分為系統基本配置表銷售模塊表采購模塊表報表模塊表等等我們可以根據這些模塊的不同分別給與不同的前綴來區分這麼做的好處是很明顯的如一看到表最大名字就可以知道這個表是屬於哪個應用的哪個模塊的這無疑可以提高數據庫設計與前台軟件開發的效率同時數據庫中默認的排序規則是按名字來排序的所以為表格設置類別前綴的話可以把同一類的表格排在一起方便我們察看
二是對表格命名的時候要考慮可讀性而不能隨便阿狗阿貓的亂取名字最常見的是那些剛學數據庫的人在表命名的時候如要建幾張測試表就會隨便命名如TESTTEST之類的雖然這只是測試但是也不符合我們的命名過則要做測試的話那就以TEST開頭然後後面加上具體要測試的內容如此的話我們才可以通過表的名字知道該表具體的用途而不用打開表去看裡面具體的結構或者注釋才能知道我們需要的信息所以在設計表的名字的時候還要關注一下其的可讀性
From:http://tw.wingwit.com/Article/program/Oracle/201311/17758.html