表是Oracle數據庫中最基本的對象之一。萬丈高樓從平地起,這個基礎對象對於數據庫來講,很是重要。由於其設計是否合理,直接跟數據庫的性能相關。從Oracle數據庫菜鳥到數據庫專家這個過程當中,在表設計與管理上,或多或少,會犯一些錯誤。筆者今天就談談本身在這方面的經驗與教訓,或許可以給你們一些警示做用。程序員
表是Oracle數據庫中最基本的對象之一。萬丈高樓從平地起,這個基礎對象對於數據庫來講,很是重要。由於其設計是否合理,直接跟數據庫的性能相關。從Oracle數據庫菜鳥到數據庫專家這個過程當中,在表設計與管理上,或多或少,會犯一些錯誤。筆者今天就談談本身在這方面的經驗與教訓,或許可以給你們一些警示做用。數據庫
經驗一:在設計大型數據庫時,把容許NULL的列放在表的後面。數據庫設計
在數據庫表設計過程當中,有些字段要求必須爲非空,如表的關鍵字,單據編號字段等等。在數據庫表建立的時候,每每須要把這些字段設置爲非空。如此的話,就能夠強制用戶輸入數據,以加強數據的一致性。性能
同時,在一張表中,也會有很多的字段,如員工信息表中,員工愛好、註釋等字段,就可能容許爲空。利用數據庫專業術語來講,這些沒有內容的字段就是「NULL」字段。設計
在數據庫表設計的時候,對於這種類型的空字段要特別的留意。一方面,這個NULL字段,不是說其裏面存儲的是空格。若利用「’’」這個符號去查詢空字段的記錄的話,每每查不到咱們想要的結果。由於在數據庫存儲的時候,若字段爲NULL,則這個值根本沒有存儲。另外一方面,正由於上面這種特性,因此,在表設計的時候,最好把容許NULL的字段放在表的末尾,當數據庫比較大或者空字段比較多的話,則能夠大大的減小數據庫的存儲空間。對象
另外,在數據庫建立表的時候,是按照列創建的時間來排序的。因此,當某個列創建好以後,除非從新刪除再創建,不然沒法調整列的順序。這就要求數據庫管理員在建立表以前,就要對列、以及是否爲空有一個明確的定義。只有如此,纔可以合理安排列的順序。排序
經驗二:養成勤於寫註釋的習慣。索引
判斷一我的是不是數據庫專家,從一個「註釋」的小習慣中就能夠 看得出來。若一我的在數據庫開發的時候,勤與寫註釋,如在創建表或者字段的時候,可以利用comment命令對錶與字段進行註釋,則能夠從必定程度上判斷他是這方面的行家。相反,若其開發的數據庫,註釋沒有多少,則基本能夠判斷,他是一個剛入門的菜鳥。或者說,其沒有參加過大型數據庫的設計。開發
這主要是由於,在數據庫開發過程當中,每每不是一我的能夠完成的。如在開發一個ERP數據庫的時候,可能有些人專門負責開發基礎表,而有些人負責維護視圖,等等。你們都是分工合做。同時,在前臺也有程序員須要調用後臺的數據庫表與字段。因此,中大型的數據庫與應用系統每每是你們協做的結果。字符串
爲此,爲了提升表與字段的可讀性,一個數據庫管理人員開發的表格,你們均可以看的懂,就須要給表與字段設置比較詳盡的註釋。在Oracle數據庫中,爲了給其餘夥伴提供有意義的幫助信息,就能夠利用Comment命令來描述表、字段的做用以及一些引用的注意事項。這個小小的命令,能夠大大提升表與字段的可讀性,提升數據庫與程序開發團隊的協做性。
經驗三:選擇合適的數據類型與長度。
雖然數據庫系統在處理數據時,某些數據類型是兼容的,或者會對相關的數據類型進行自動的轉換。如對於一些日期類型的字段,其也能夠賦值給字符類型的字段;整數型的字段跟浮點型的數據類型也是兼容的。可是,數據庫設計人員不能由於數據庫系統的這個特性,就放寬了對數據類型的把關。由於有時候,如在基礎數據導入或者數據成批更新的時候,雖然最後能夠成功完成任務。可是,數據庫在這個過程當中,須要進行數據類型的轉換,就額外的增長了數據庫的負擔。
另外,在數據庫設計的時候,也須要考慮字段的長度。若在創建表的時候,字段設計的太長,則會浪費存儲空間。相反,若設計的過短的話,會影響前臺系統的使用。因此,數據庫管理員對於字段的長度,也要引發足夠的重視。
再者,若在建立字段的時候,不可以確認字段長度的話,則最好採用變長的數據類型。如以字符型數據類型爲例,就有CHAR與VARHAR2兩種。其中,CHAR字符類型主要用來存儲固定長度的字符串,容許的最大長度爲2000字節。若實際存儲的信息內容不到定義的位數的話,則系統會在這些列值爲部添加空格,直到其長度到爲止。可見,若採用固定長度字段類型的話,即便數據沒有這麼多,也會佔用這麼多的存儲空間。因此,這種方式下,存儲空間的浪費會比較大。後者主要用來存儲可變長度的字符數據。當在VARCHAR2列中插入的數據,若是沒有到其最大位數的話,則數據庫不會在尾部添加空格。從而可讓空間利用最大化。
因此,在表設計的時候,數據庫管理員要選擇合適的數據類型,而且爲其設置合適的長度。
經驗四:肯定表須要採用的完整性約束與默認值。
有些數據庫管理員在數據庫設計的時候,喜歡邊設計邊開發。如在設計表的時候,一開始不肯定那些字段要添加約束,哪些字段不能爲空,哪些字段須要什麼默認值等等。等到須要的時候,再隨意添加。這種作事方式,每每會給數據庫帶來不穩定的隱患。
如某個數據庫管理人員在創建表的時候,一開始沒有給某個字段設置爲默認值。後來前臺程序開發人員說須要給這個字段添加某個默認值。可是,此時這個表中已經有了跟系統相關的基礎數據。有了數據的表格後,每每不容許再從新設置默認值。不然的話,會給數據庫形成必定的負面影響。
因此,筆者認爲,數據庫管理員在創建表以前,須要肯定表所須要的完整性。如哪些列做爲主鍵;哪些列做爲外鍵;哪些列須要惟一性等等。
經驗五:肯定表須要採用的類型。
在Oralce數據庫中,存儲用戶數據可使用標準表、索引表、築表和分區表。有時候,基於不用的應用,選擇不一樣類型的數據表,每每能夠大大的提升數據庫的性能,特別是數據查詢的效率。
如在合適的狀況下,數據庫管理員可使用築表節省存儲空間並提升特定類型的SQL語句的性能。不過,咱們平時利用的比較多的出了基本表以外,就是索引表了。由於索引表在某些特殊的應用下,能夠表現出很好的性能。如在索引表中,能夠經過溢出存儲功能提升經常使用列的查詢速度;若是常常須要經過主鍵來查詢整條記錄的話,則利用索引表能夠明顯提升查詢效率。固然,索引表也不可以亂用。若索引表所存儲的數據,變化比較頻繁的話,則採用索引表這種類型的表格,反而會事倍功半。
因此,爲數據庫表選擇合適的類型,能夠大幅度的提升數據庫的性能。當數據庫的記錄數量越大,這種優點就越明顯。
總之,筆者認爲,在Oracle數據庫設計中,表的創建雖然是一項基礎工做。可是,有時候對於數據庫的性能,比其餘內容影響更加深遠。因此,咱們要重視表的設計,從基礎作起,爲提高數據庫的性能而努力。