參考阿里巴巴MySQL數據庫設計規範,詳細信息可查看《阿里巴巴Java開發手冊》第五章。
表達是否概念的字段,必須使用 is_xxx
的方式命名,數據類型必須爲unsigned tinyint(1)
;html
例如:是不是刪除狀態應該使用 is_delete
;mysql
數據庫名、表名、字段名只能使用 小寫字母(a-z)、劃線(_) 、阿拉伯數字(0-9)組成,禁止使用
中文、大寫字母、特殊符號、mysql關鍵字`命名。sql
例如:正例 user_name0,反例 userName0數據庫
附《MySQL》關鍵字大全:緩存
https://dev.mysql.com/doc/refman/5.7/en/keywords.html
表名應以 模塊名_表做用
命名;mybatis
例如:系統權限表 sys_permission,車輛保險表 card_insurance,支付配置表 pay_config數據庫設計
主鍵索引(primary key)的索引名爲 pk_字段名
,惟一索引(unique key)的索引名爲 uk_字段名
,搜索引擎
普通索引(index)的索引名爲 idx_字段名
。設計
存儲小數使用decimal
,若是精度超過限制的,可把整數和小數分開存儲。調試
例如:咱們存儲 124.123,數據類型定義爲:decimal(16,3)
固定長度
的應使用 char(n),n表示存儲的字符數。
提示:char裏不要存儲漢字,通常用於存儲手機號碼,電話號碼,身份證之類的長度相對比較固定的數據。
varchar 爲可變長度的字符串,存儲長度不要超過5000
字符,超過的應定義爲text,而且獨立存儲。
經常使用varchar長度參考:
姓名:varchar(75) 民族:varchar(16) 政治面貌:varchar(16) 企業名稱:varchar(64) 地址:varchar(255) 記錄備註:varchar(255)
存儲金額能夠轉化爲分存儲,存儲類型 10位之內使用int(11)
,超過 10位以上使用bigint(21)
;
提示:bigint(21) 佔用空間8Bytes,int(11) 佔用空間4Bytes
表中必須包含4個字段 id,gmt_create,gmt_modified,is_delete
字段;
提示:其中id爲primary key、unsigned、bigint,gmt_create爲記錄建立時間,gmt_modified記錄修改時間,is_delete 記錄是否邏輯刪除;gmt_create、gmt_modified均爲datetime類型。
具備惟一特性的字段,必須建惟一索引(墨菲定理:壞可能必定會發生)。
join禁止超過3個表,須要join字段類型必須絕對一致,多表關聯查詢,被關聯的字段須要有索引。
在 varchar 上創建索引時,必須指定索引的長度
。
語法: CREATE INDEX index_name ON table_name (column_name(length), clolumn_name(length)…); 計算區分度:column_name若是設置length爲5時,區分度爲計算以下, select count(distinct left(column_name, 5))/count(*) from table_name;
在建索引時區分度最高
的在最左邊。
例如:在t表中,a、b、c字段的區分度從大到小爲 b>a>c ,那麼建索引的順序爲 b_a_c;須要注意的是,若是出現等號非等號的混合判斷,等號的列必須放在索引的前列,如:where a>? and b=?,即便a的區分度在高b也要在索引的前列。
不要使用 count(column_name)、count(num)來代替count(*),count(*)是SQL92標準統計行數
的語法。
count(column_name)時,若是column_name中包含NULL值
的,會被忽略
;
sum(column_name)若是column_name列中全是NULL,則返回NULL,爲了防止查詢出NULL值可以使用IF
判斷來設置默認值
select IF(ISNULL(column_name),0,sum(column_name)) as count_num from table_name
必須使用ISNULL(column_name)
來判斷是否爲NULL值,是則返回1,不然返回0 ;
例如:查詢business_bill表裏arrears_amount值爲null的記錄
select * from business_bill where ISNULL(arrears_amount)=1;
禁止使用
視圖、存儲過程、觸發器,由於難以調試和擴展。
在刪除和修改數據以前,必須先查詢
出數據,防止數據誤刪。
在使用in操做符時,in括號裏面的數量小於1000
。
在mybatis中,禁止使用 * 號
做爲查詢列表,要寫出查詢的字段。
xml文件中參數不要使用${}
,防止sql注入
。
修改gmt_modified
爲當前時間。在使用事務@Transactional時,要考慮各方面的事務回滾,包括緩存回滾、搜索引擎回滾、消息補償、統計修正等操做。