今天在Java Code Geeks這個網站又看到一篇實用的文章,雖然是一個講Java的網站,不過對於關聯式資料庫的設計來說,大部分的原理原則都是相通,以下這20條最佳實踐,其實大部分在我自己的設計上已經這麼做了,不過在初老癥狀不斷出現的現在,為了怕忘記,還是給它記下來先…
設計資料庫的20個最佳實踐
原文:http://www.javacodegeeks.com/2012/02/20-database-design-best-practices.html
- 資料表和欄位的命名要一致且有意義(例如:School, StudentCourse, CourseID …)。
- 資料表名稱用單數(例如:用StudentCourse,而不是StudentCourses)。資料表本來就代表了實體的集合,沒有必要使用複數名稱。
- 資料表名稱不要用空白。不然你必須要用
{
,[
,"
等等的字元來表示資料表(例如:要存取資料表Student Course,你必須這樣寫”Student Course”。所以取名StudentCourse比較好)。 - 資料表名稱不要加不必要的前綴詞(prefix)或後綴詞(suffix)(例如:使用School,而不要用TblSchool、SchoolTable等等)。
- 密碼要加密以維護安全。有必要才在應用程式端解密。
- 所有的資料表都要有一個整數型別的id欄位。即使當前不需要id,以後也有可能會用到(例如在合併資料表或做索引的時候)。
- 選擇整數資料型別的欄位(或其變體)來做索引,用varchar欄位做索引會有效能上的問題。
- 選擇bit欄位給布林值使用。整數或varchar沒有必要,而且也浪費儲存空間。另外,替這些欄位取名為”Is”…什麼的(例如IsTeacher來代表是或否)。
- 資料庫存取要提供驗證關卡,不要每個使用者都給予最高管理員的權限。
- 除非真的必要,否則避免使用”select *”這樣的查詢語句,使用”select [必要的欄位表列]”這樣效能比較好。
- 如果應用程式比較龐大複雜,使用有ORM(object relational mapping)的framework(例如:hibernate, iBatis …)。ORM framework的效能問題可以透過詳細的設置參數調教來解決。
- 將比較大且較少用到的資料表與其他資料表分開,放到不同的實體儲存空間,這樣能提昇效能。
- 對於比較大、比較敏感、比較關鍵重要的資料庫系統,使用災難復原及安全防護服務,例如failover clustering, auto backups, replication等等。
- 使用constraints(foreign key, check, not null …)來維護資料的完整性,不要把控制權整個交給應用程式。
- 缺少資料庫文件,這樣很不好。用ER schema或其他文件來記錄你的資料庫設計。另外trigger、stored procedures及其他程式化的東西也要記得寫註解。
- 對於查詢比較頻繁的大資料表,要使用索引。可以使用分析工具來決定哪裡該使用索引。對於大範圍的資料記錄擷取,通常叢集索引比較好。對於單點查詢,通常非叢集索引比較好。
- 資料庫伺服器和Web伺服器一定要分開在不同的機器上。這樣能提供較安全的保護(駭客不能直接存取資料),伺服器CPU和記憶體的效能也會比較好,因為要求及處理量分散開了。
- 查詢比較頻繁的資料表,不要定義Image或blob的資料型別,因為會有效能問題。這些資料最好另外放在獨立的資料表,然後在查詢資料表的時候使用pointer。
- 有必要就使用正規化來對效能最佳化,正規化不足會導致資料的重複,正規化太多會導致join太多的資料表,兩者都會引起效能低落。
- 寧願多花時間在資料庫的設計與建模上,否則之後你可能會花上10倍甚至1000倍的時間去維護及重新設計。