MySQL數據庫設計規範

參考阿里巴巴MySQL數據庫設計規範,詳細信息可查看《阿里巴巴Java開發手冊》第五章。

1、建表規約

  1. 表達是否概念的字段,必須使用 is_xxx 的方式命名,數據類型必須爲unsigned tinyint(1)html

    例如:是不是刪除狀態應該使用 is_deletemysql

  2. 數據庫名、表名、字段名只能使用 小寫字母(a-z)、劃線(_) 、阿拉伯數字(0-9)組成,禁止使用中文、大寫字母、特殊符號、mysql關鍵字`命名。sql

    例如:正例 user_name0,反例 userName0數據庫

    附《MySQL》關鍵字大全緩存

    https://dev.mysql.com/doc/refman/5.7/en/keywords.html
  3. 表名應以 模塊名_表做用 命名;mybatis

    例如:系統權限表 sys_permission,車輛保險表 card_insurance,支付配置表 pay_config數據庫設計

  4. 主鍵索引(primary key)的索引名爲 pk_字段名,惟一索引(unique key)的索引名爲 uk_字段名搜索引擎

    普通索引(index)的索引名爲 idx_字段名設計

  5. 存儲小數使用decimal,若是精度超過限制的,可把整數和小數分開存儲。調試

    例如:咱們存儲 124.123,數據類型定義爲:decimal(16,3)

  6. 固定長度的應使用 char(n),n表示存儲的字符數。

    提示:char裏不要存儲漢字,通常用於存儲手機號碼,電話號碼,身份證之類的長度相對比較固定的數據。

  7. varchar 爲可變長度的字符串,存儲長度不要超過5000字符,超過的應定義爲text,而且獨立存儲。

    經常使用varchar長度參考

    姓名:varchar(75)
    民族:varchar(16)
    政治面貌:varchar(16)
    企業名稱:varchar(64)
    地址:varchar(255)
    記錄備註:varchar(255)
  8. 存儲金額能夠轉化爲分存儲,存儲類型 10位之內使用int(11),超過 10位以上使用bigint(21)

    提示:bigint(21) 佔用空間8Bytes,int(11) 佔用空間4Bytes

  9. 表中必須包含4個字段 id,gmt_create,gmt_modified,is_delete 字段;

    提示:其中id爲primary key、unsigned、bigint,gmt_create爲記錄建立時間,gmt_modified記錄修改時間,is_delete 記錄是否邏輯刪除;gmt_create、gmt_modified均爲datetime類型。

2、索引規約

  1. 具備惟一特性的字段,必須建惟一索引(墨菲定理:壞可能必定會發生)。

  2. join禁止超過3個表,須要join字段類型必須絕對一致,多表關聯查詢,被關聯的字段須要有索引。

  3. 在 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;
  4. 在建索引時區分度最高的在最左邊。

    例如:在t表中,a、b、c字段的區分度從大到小爲 b>a>c ,那麼建索引的順序爲 b_a_c;須要注意的是,若是出現等號非等號的混合判斷,等號的列必須放在索引的前列,如:where a>? and b=?,即便a的區分度在高b也要在索引的前列。

3、SQL語句規約

  1. 不要使用 count(column_name)、count(num)來代替count(*),count(*)是SQL92標準統計行數的語法。

  2. count(column_name)時,若是column_name中包含NULL值的,會被忽略

  3. sum(column_name)若是column_name列中全是NULL,則返回NULL,爲了防止查詢出NULL值可以使用IF判斷來設置默認值

    select IF(ISNULL(column_name),0,sum(column_name)) as count_num from table_name
  4. 必須使用ISNULL(column_name)來判斷是否爲NULL值,是則返回1,不然返回0 ;

    例如:查詢business_bill表裏arrears_amount值爲null的記錄

    select * from business_bill where ISNULL(arrears_amount)=1;
  5. 禁止使用視圖、存儲過程、觸發器,由於難以調試和擴展。

  6. 在刪除和修改數據以前,必須先查詢出數據,防止數據誤刪。

  7. 在使用in操做符時,in括號裏面的數量小於1000

4、ORM映射

  1. 在mybatis中,禁止使用 * 號做爲查詢列表,要寫出查詢的字段。

  2. xml文件中參數不要使用${} ,防止sql注入

  3. 修改記錄時必須修改gmt_modified爲當前時間。
  4. 在使用事務@Transactional時,要考慮各方面的事務回滾,包括緩存回滾、搜索引擎回滾、消息補償、統計修正等操做。

相關文章
相關標籤/搜索