[Database] 設計資料庫的20個最佳實踐

今天在Java Code Geeks這個網站又看到一篇實用的文章,雖然是一個講Java的網站,不過對於關聯式資料庫的設計來說,大部分的原理原則都是相通,以下這20條最佳實踐,其實大部分在我自己的設計上已經這麼做了,不過在初老癥狀不斷出現的現在,為了怕忘記,還是給它記下來先…

設計資料庫的20個最佳實踐

原文:http://www.javacodegeeks.com/2012/02/20-database-design-best-practices.html

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

發佈留言