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