Oracle資料庫表設計時的注意事項
表是Oracle資料庫中最基本的物件之一。萬丈高樓從平地起,這個基礎物件對於資料庫來說,非常重要。因為其設計是否合理,直接跟資料庫的效能相關。從Oracle資料庫菜鳥到資料庫專家這個過程中,在表設計與管理上,或多或少,會犯一些錯誤。筆者今天就談談自己在這方面的經驗與教訓,或許能夠給大家一些警示作用。
經驗一:在設計大型資料庫時,把允許NULL的列放在表的後面。
在資料庫表設計過程中,有些欄位要求必須為非空,如表的關鍵字,單據編號欄位等等。在資料庫表建立的時候,往往需要把這些欄位設定為非空。如此的話,就可以強制使用者輸入資料,以增強資料的一致性。
同時,在一張表中,也會有不少的欄位,如員工資訊表中,員工愛好、註釋等欄位,就可能允許為空。利用資料庫專業術語來說,這些沒有內容的欄位就是“NULL”欄位。
在資料庫表設計的時候,對於這種型別的空欄位要特別的留意。一方面,這個NULL欄位,不是說其裡面儲存的是空格。若利用“’’”這個符號去查詢空欄位的記錄的話,往往查不到我們想要的結果。因為在資料庫儲存的時候,若欄位為NULL,則這個值根本沒有儲存。另一方面,正因為上面這種特性,所以,在表設計的時候,最好把允許NULL的欄位放在表的末尾,當資料庫比較大或者空欄位比較多的話,則可以大大的減少資料庫的儲存空間。
另外,在資料庫建立表的時候,是按照列建立的時間來排序的。所以,當某個列建立好之後,除非重新刪除再建立,否則無法調整列的順序。這就要求資料庫管理員在建立表之前,就要對列、以及是否為空有一個明確的定義。只有如此,才能夠合理安排列的順序。
經驗二:養成勤於寫註釋的習慣。
判斷一個人是否是資料庫專家,從一個“註釋”的小習慣中就可以 看得出來。若一個人在資料庫開發的時候,勤與寫註釋,如在建立表或者欄位的時候,能夠利用comment命令對錶與欄位進行註釋,則可以從一定程度上判斷他是這方面的行家。相反,若其開發的資料庫,註釋沒有多少,則基本可以判斷,他是一個剛入門的菜鳥。或者說,其沒有參加過大型資料庫的設計。
這主要是因為,在資料庫開發過程中,往往不是一個人可以完成的。如在開發一個ERP資料庫的時候,可能有些人專門負責開發基礎表,而有些人負責維護檢視,等等。大家都是分工合作。同時,在前臺也有程式設計師需要呼叫後臺的資料庫表與欄位。所以,中大型的資料庫與應用系統往往是大家協作的結果。
為此,為了提高表與欄位的可讀性,一個資料庫管理人員開發的表格,大家都可以看的懂,就需要給表與欄位設定比較詳盡的註釋。在Oracle資料庫中,為了給其他夥伴提供有意義的幫助資訊,就可以利用Comment命令來描述表、欄位的作用以及一些引用的注意事項。這個小小的命令,可以大大提高表與欄位的可讀性,提高資料庫與程式開發團隊的協作性。
經驗三:選擇合適的資料型別與長度。
雖然資料庫系統在處理資料時,某些資料型別是相容的,或者會對相關的資料型別進行自動的轉換。如對於一些日期型別的欄位,其也可以賦值給字元型別的欄位;整數型的欄位跟浮點型的資料型別也是相容的。但是,資料庫設計人員不能因為資料庫系統的這個特性,就放寬了對資料型別的把關。因為有時候,如在基礎資料匯入或者資料成批更新的時候,雖然最後可以成功完成任務。但是,資料庫在這個過程中,需要進行資料型別的轉換,就額外的增加了資料庫的負擔。
另外,在資料庫設計的時候,也需要考慮欄位的長度。若在建立表的時候,欄位設計的太長,則會浪費儲存空間。相反,若設計的太短的話,會影響前臺系統的使用。所以,資料庫管理員對於欄位的長度,也要引起足夠的重視。
再者,若在建立欄位的時候,不能夠確認欄位長度的話,則最好採用變長的資料型別。如以字元型資料型別為例,就有CHAR與VARHAR2兩種。其中,CHAR字元型別主要用來儲存固定長度的字串,允許的最大長度為2000位元組。若實際儲存的資訊內容不到定義的位數的話,則系統會在這些列值為部新增空格,直到其長度到為止。可見,若採用固定長度欄位型別的話,即使資料沒有這麼多,也會佔用這麼多的儲存空間。所以,這種方式下,儲存空間的浪費會比較大。後者主要用來儲存可變長度的字元資料。當在VARCHAR2列中插入的資料,如果沒有到其最大位數的話,則資料庫不會在尾部新增空格。從而可以讓空間利用最大化。
所以,在表設計的時候,資料庫管理員要選擇合適的資料型別,並且為其設定合適的長度。
經驗四:確定表需要採用的完整性約束與預設值。
有些資料庫管理員在資料庫設計的時候,喜歡邊設計邊開發。如在設計表的時候,一開始不確定那些欄位要新增約束,哪些欄位不能為空,哪些欄位需要什麼預設值等等。等到需要的時候,再隨意新增。這種做事方式,往往會給資料庫帶來不穩定的隱患。
如某個資料庫管理人員在建立表的時候,一開始沒有給某個欄位設定為預設值。後來前臺程式開發人員說需要給這個欄位新增某個預設值。但是,此時這個表中已經有了跟系統相關的基礎資料。有了資料的表格後,往往不允許再重新設定預設值。否則的話,會給資料庫造成一定的負面影響。
所以,筆者認為,資料庫管理員在建立表之前,需要確定表所需要的完整性。如哪些列作為主鍵;哪些列作為外來鍵;哪些列需要唯一性等等。
經驗五:確定表需要採用的型別。
在Oralce資料庫中,儲存使用者資料可以使用標準表、索引表、築表和分割槽表。有時候,基於不用的應用,選擇不同型別的資料表,往往可以大大的提高資料庫的效能,特別是資料查詢的效率。
如在合適的情況下,資料庫管理員可以使用築表節省儲存空間並提高特定型別的SQL語句的效能。不過,我們平時利用的比較多的出了基本表之外,就是索引表了。因為索引表在某些特殊的應用下,可以表現出很好的效能。如在索引表中,可以通過溢位儲存功能提高常用列的查詢速度;如果經常需要通過主鍵來查詢整條記錄的話,則利用索引表可以明顯提高查詢效率。當然,索引表也不能夠亂用。若索引表所儲存的資料,變化比較頻繁的話,則採用索引表這種型別的表格,反而會事倍功半。
所以,為資料庫表選擇合適的型別,可以大幅度的提高資料庫的效能。當資料庫的記錄數量越大,這種優勢就越明顯。
總之,筆者認為,在Oracle資料庫設計中,表的建立雖然是一項基礎工作。但是,有時候對於資料庫的效能,比其他內容影響更加深遠。所以,我們要重視表的設計,從基礎做起,為提升資料庫的效能而努力。
經驗一:在設計大型資料庫時,把允許NULL的列放在表的後面。
在資料庫表設計過程中,有些欄位要求必須為非空,如表的關鍵字,單據編號欄位等等。在資料庫表建立的時候,往往需要把這些欄位設定為非空。如此的話,就可以強制使用者輸入資料,以增強資料的一致性。
同時,在一張表中,也會有不少的欄位,如員工資訊表中,員工愛好、註釋等欄位,就可能允許為空。利用資料庫專業術語來說,這些沒有內容的欄位就是“NULL”欄位。
在資料庫表設計的時候,對於這種型別的空欄位要特別的留意。一方面,這個NULL欄位,不是說其裡面儲存的是空格。若利用“’’”這個符號去查詢空欄位的記錄的話,往往查不到我們想要的結果。因為在資料庫儲存的時候,若欄位為NULL,則這個值根本沒有儲存。另一方面,正因為上面這種特性,所以,在表設計的時候,最好把允許NULL的欄位放在表的末尾,當資料庫比較大或者空欄位比較多的話,則可以大大的減少資料庫的儲存空間。
另外,在資料庫建立表的時候,是按照列建立的時間來排序的。所以,當某個列建立好之後,除非重新刪除再建立,否則無法調整列的順序。這就要求資料庫管理員在建立表之前,就要對列、以及是否為空有一個明確的定義。只有如此,才能夠合理安排列的順序。
經驗二:養成勤於寫註釋的習慣。
判斷一個人是否是資料庫專家,從一個“註釋”的小習慣中就可以 看得出來。若一個人在資料庫開發的時候,勤與寫註釋,如在建立表或者欄位的時候,能夠利用comment命令對錶與欄位進行註釋,則可以從一定程度上判斷他是這方面的行家。相反,若其開發的資料庫,註釋沒有多少,則基本可以判斷,他是一個剛入門的菜鳥。或者說,其沒有參加過大型資料庫的設計。
這主要是因為,在資料庫開發過程中,往往不是一個人可以完成的。如在開發一個ERP資料庫的時候,可能有些人專門負責開發基礎表,而有些人負責維護檢視,等等。大家都是分工合作。同時,在前臺也有程式設計師需要呼叫後臺的資料庫表與欄位。所以,中大型的資料庫與應用系統往往是大家協作的結果。
為此,為了提高表與欄位的可讀性,一個資料庫管理人員開發的表格,大家都可以看的懂,就需要給表與欄位設定比較詳盡的註釋。在Oracle資料庫中,為了給其他夥伴提供有意義的幫助資訊,就可以利用Comment命令來描述表、欄位的作用以及一些引用的注意事項。這個小小的命令,可以大大提高表與欄位的可讀性,提高資料庫與程式開發團隊的協作性。
經驗三:選擇合適的資料型別與長度。
雖然資料庫系統在處理資料時,某些資料型別是相容的,或者會對相關的資料型別進行自動的轉換。如對於一些日期型別的欄位,其也可以賦值給字元型別的欄位;整數型的欄位跟浮點型的資料型別也是相容的。但是,資料庫設計人員不能因為資料庫系統的這個特性,就放寬了對資料型別的把關。因為有時候,如在基礎資料匯入或者資料成批更新的時候,雖然最後可以成功完成任務。但是,資料庫在這個過程中,需要進行資料型別的轉換,就額外的增加了資料庫的負擔。
另外,在資料庫設計的時候,也需要考慮欄位的長度。若在建立表的時候,欄位設計的太長,則會浪費儲存空間。相反,若設計的太短的話,會影響前臺系統的使用。所以,資料庫管理員對於欄位的長度,也要引起足夠的重視。
再者,若在建立欄位的時候,不能夠確認欄位長度的話,則最好採用變長的資料型別。如以字元型資料型別為例,就有CHAR與VARHAR2兩種。其中,CHAR字元型別主要用來儲存固定長度的字串,允許的最大長度為2000位元組。若實際儲存的資訊內容不到定義的位數的話,則系統會在這些列值為部新增空格,直到其長度到為止。可見,若採用固定長度欄位型別的話,即使資料沒有這麼多,也會佔用這麼多的儲存空間。所以,這種方式下,儲存空間的浪費會比較大。後者主要用來儲存可變長度的字元資料。當在VARCHAR2列中插入的資料,如果沒有到其最大位數的話,則資料庫不會在尾部新增空格。從而可以讓空間利用最大化。
所以,在表設計的時候,資料庫管理員要選擇合適的資料型別,並且為其設定合適的長度。
經驗四:確定表需要採用的完整性約束與預設值。
有些資料庫管理員在資料庫設計的時候,喜歡邊設計邊開發。如在設計表的時候,一開始不確定那些欄位要新增約束,哪些欄位不能為空,哪些欄位需要什麼預設值等等。等到需要的時候,再隨意新增。這種做事方式,往往會給資料庫帶來不穩定的隱患。
如某個資料庫管理人員在建立表的時候,一開始沒有給某個欄位設定為預設值。後來前臺程式開發人員說需要給這個欄位新增某個預設值。但是,此時這個表中已經有了跟系統相關的基礎資料。有了資料的表格後,往往不允許再重新設定預設值。否則的話,會給資料庫造成一定的負面影響。
所以,筆者認為,資料庫管理員在建立表之前,需要確定表所需要的完整性。如哪些列作為主鍵;哪些列作為外來鍵;哪些列需要唯一性等等。
經驗五:確定表需要採用的型別。
在Oralce資料庫中,儲存使用者資料可以使用標準表、索引表、築表和分割槽表。有時候,基於不用的應用,選擇不同型別的資料表,往往可以大大的提高資料庫的效能,特別是資料查詢的效率。
如在合適的情況下,資料庫管理員可以使用築表節省儲存空間並提高特定型別的SQL語句的效能。不過,我們平時利用的比較多的出了基本表之外,就是索引表了。因為索引表在某些特殊的應用下,可以表現出很好的效能。如在索引表中,可以通過溢位儲存功能提高常用列的查詢速度;如果經常需要通過主鍵來查詢整條記錄的話,則利用索引表可以明顯提高查詢效率。當然,索引表也不能夠亂用。若索引表所儲存的資料,變化比較頻繁的話,則採用索引表這種型別的表格,反而會事倍功半。
所以,為資料庫表選擇合適的型別,可以大幅度的提高資料庫的效能。當資料庫的記錄數量越大,這種優勢就越明顯。
總之,筆者認為,在Oracle資料庫設計中,表的建立雖然是一項基礎工作。但是,有時候對於資料庫的效能,比其他內容影響更加深遠。所以,我們要重視表的設計,從基礎做起,為提升資料庫的效能而努力。
相關文章
- 資料庫程式設計注意事項資料庫程式設計
- MySQL 資料庫設計和注意事項MySql資料庫
- 更改當前資料庫預設臨時表空間注意事項資料庫
- Oracle臨時表使用注意事項Oracle
- Oracle 資料庫升級注意事項Oracle資料庫
- 備份 master 資料庫時的注意事項AST資料庫
- Oracle資料庫中Create user的注意事項Oracle資料庫
- 【TEMPORARY TABLE】Oracle臨時表使用注意事項Oracle
- 備份model 和msdb 資料庫時的注意事項資料庫
- MySQL 資料庫-索引注意事項MySql資料庫索引
- Oracle 資料匯出注意事項Oracle
- Oracle資料庫遠端連線設定的四種方法及其注意事項Oracle資料庫
- 程式設計注意事項程式設計
- 使用Oracle9i資料庫的九大注意事項(轉)Oracle資料庫
- 資料庫開發程式設計師在開發過程中的注意事項資料庫程式設計師
- Oracle 重建表(rename)注意事項總結Oracle
- Oracle 重建表(rename)注意事項小結Oracle
- Oracle的 資料型別比較及注意事項Oracle資料型別
- Oracle使用*的注意事項Oracle
- 網站設計中的注意事項網站
- Oracle goldengate初始化資料注意事項OracleGo
- Oracle9i資料庫的Standby端執行備份,注意事項~Oracle資料庫
- 選擇“大資料”分析平臺時的注意事項大資料
- PG 資料庫 DTS 遷移需要注意的事項:資料庫
- 【TABLE】oracle表線上重定義注意事項Oracle
- 資料網格的注意事項 - Kineret
- Oracle:記憶體設定注意事項Oracle記憶體
- 資料所有權設定中需要注意的事項
- oracle 轉pg 的注意事項Oracle
- 複製資料庫中需要注意的幾點事項資料庫
- removeChild使用時注意事項REM
- 把資料從MySQL遷到Oracle的幾點注意事項MySqlOracle
- 在T-SQL中使用臨時表的注意事項SQL
- 大資料學習注意事項大資料
- JAVA程式設計注意事項(效能篇)Java程式設計
- XML PUBLISHER 輸出資料庫圖片需注意事項XML資料庫
- 敏捷企業的資料管理注意事項敏捷
- Oracle IMPDP匯入資料案例之注意事項(undo/temp)Oracle