1. 建表規約
1) 表中字段名稱
a) 表達是否概念的字段,必須使用is_xxx的方式命名,數據類型是bit
b) 小數類型為decimal,禁止使用float和double。
說明:float和double在存儲的時候,存在精度損失的問題,很可能在值得比較時,得到不正確的結果。如果存儲的數據范圍超過decimal的范圍,建議將數據拆成整數和小數分開存儲。
c) 字段允許適當的冗余,以提高性能,但是必須考慮數據同步的情況
冗余字段應遵循:
n 不是頻繁修改的字段。
n 不是varchar超長字段,更不能是text字段
2) 主鍵索引名為pk_字段名;唯一索引名為uk_字段名;普通索引名則為idx_字段名。
說明:pk_即primary key,uk_即unique key;idx_即index的簡稱。
2. SQL規約
1) 不要使用count(列名)或count(常量)來替代count(*),count(*)是SQL92 定義的 標准統計行數的語法,跟數據庫無關,跟 NULL 有關。
說明:count(*)會統計值為NULL的行,而count(列名)不會統計此列為NULL值的行。
2) 使用ISNULL()來判斷是否為NULL值。
注意:NULL與任何值的直接比較都為 NULL。
說明:
1)NULL<>NULL 的返回結果是NULL,而不是false。
2)NULL=NULL 的返回結果是NULL,而不是true。
3)NULL<>1 的返回結果是NULL,而不是true。
3) 在代碼中寫分頁查詢邏輯時,若count為0應直接返回,避免執行后面的分頁語句。
4) 不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。
說明:學生表中的student_id是主鍵,那么成績表中的student_id則為外鍵。如果更新學生表中的student_id,同時觸發成績表中的student_id更新,則為級聯更新。外鍵與級聯更新適用於單機低並發,不適合分布式、高並發集群;級聯更新是強阻塞,存在數據庫更新風暴的風險;外鍵影響數據庫的插入速度。
4) 避免使用存儲過程,存儲過程難以調試和擴展,更沒有移植性。
5) 數據訂正時,刪除和修改記錄時,要先select,避免出現誤刪除,確認無誤才能執行更新語句。
6) in操作能避免則避免,若實在避免不了,需要仔細評估in后邊的集合元素數量,控制在1000個之內。
7) TRUNCATE TABLE比DELETE速度快,且使用的系統和事務日志資源少,但TRUNCATE無事務且不觸發trigger,有可能造成事故,故不建議在開發代碼中使用此語句。
說明:DELETE語句必須帶條件where,刪除全表也可加where 1=1。
8) 在表查詢中,一律不要使用 * 作為查詢的字段列表,需要哪些字段必須明確寫明。
9) 不要寫一個大而全的數據更新接口,不管是不是自己的目標更新字段,都進行update這是不對的。執行 SQL 時,盡量不要更新無改動的字段,一是易出錯;二是效率低。