?
數據庫設計規范:
1,表設計規范
1.1關于表設計
a)???????? 表名、列名必須有注釋。
b)?????????命名應使用富有意義的英文詞匯或者縮寫,多個單詞組成的,全部大寫,以”_”分隔開來,只能使用英文字母,數字和下劃線,不留空格。比如USER_DETALL,不允許使用關鍵字TYPE或者STATUS等來作為字段名。
c)?????????命名長度不超過15個字符為宜(避免超過20),應該反映數據集所在的業務范圍,或者業務功能,如POWER_USER(用戶中心)等。
d)?????????當字段類型為枚舉或者布爾型時,使用?CHAR(1)(或者CHAR(2))類型,填寫默認值,狀態字段的默認值不能為null一般是設置成0或者-1,狀態字段的描述寫成?comment ‘團購券狀態:1.已購買;2.已使用;3.退款中;4已退款’。
?
e)?????????在設計時候盡量包含日期字段:CREATE_DATE(創建日期),UPDATE_DATE(更新日期)等。mysql中對日期約定一種錄入方式,如’2014-12-31 00:00:00.0′
f)??????????默認值,數字類型默認值為0,字符串默認值為’’,日期默認值為’1900-01-01 00:00:00.0’。
g)?????????主鍵字段ID用bigint,如果create語句中有AUTO_INCREMENT=6653864標示,請去掉。
h)?????????日期字段的默認值也不能為null,一般設置成1970-12-31 00:00:00.0。
?
i)???????????手機字段,郵箱字段等會被檢索的字段不允許為null,默認值為空串’’。數字類型字段不允許為null默認值為0。
j)???????????默認字符編碼為utf8,默認存儲引擎為INNODB
PS:每個表必須有主鍵字段,必須有錄入日期字段并且值不允許為NULL。
1.2?索引設計
1)?????????普通索引,以IDX_開頭連接字段名字。
2)?????????值范圍重復的比例少的,建立索引字段,比如? CREATE_DATE(錄入時間)字段;值范圍重復比率的字段不需要建立索引比如IS_RETURN(是否已退款)字段。
3)?????????主鍵字段不需要建立unique key,主鍵字段也不需要單獨建索引。
4)?????????WHERE條件后面的經常查詢的字段,需要加索引,比如ORDER_GOODS?表的ORDER_SN(商品號)等。
5)?????????范圍字段不需要加索引,比如SHOP_MALL表的IS_DEL字段等。
6)?????????建立索引的字段,要求不能有null值,否則會影響索引的效率。
?
1.3表結構范例
建表語句范例:
CREATE TABLE `SHOP_GAY` (
? `ID` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT ‘店鋪ID’,
? `SHOP_NAME` VARCHAR(50) DEFAULT ” COMMENT ‘店鋪名稱’,
? `LEGAL_PERSON_MOBILE` VARCHAR(11) DEFAULT NULL COMMENT ‘法人移動電話’,
? `SCORE` BIGINT(20) DEFAULT 0 COMMENT ‘積分’,
? ……
? `MANAGER_NAME` VARCHAR(20) DEFAULT ” COMMENT ‘店長姓名’,
? `BRIEF` VARCHAR(500) DEFAULT ” COMMENT ‘店鋪簡介’,
? `HAS_WAREHOUSE` CHAR(1) DEFAULT ‘0’ COMMENT ‘是否有倉庫, 0:沒有; 1:有?‘,
? `DESCRIPTION_FIT` DECIMAL(3,1) DEFAULT 0 COMMENT ‘描述相符–通過對所有訂單商品的評價計算平均值取一位小數得到’,
? `BACKGROUND` VARCHAR(200) DEFAULT ” COMMENT ‘店鋪標題圖片’,
? `CREATED_DATE` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT ‘創建時間’,
? `UPDATED_DATE` DATETIME DEFAULT ‘1970-12-31 00:00:00.0’ COMMENT ‘更新時間’,
? PRIMARY KEY (`ID`),
? KEY IDX_MOB(LEGAL_PERSON_MOBILE),
? KEY IDX_CRETIME(CREATED_DATE),
? KEY IDX_UPTIME(UPDATED_DATE)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT=’GAY店鋪’
?
添加字段范例:
ALTER TABLE AUTH_MALL ADD COLUMN SHORT_NAME VARCHAR(20) DEFAULT ” COMMENT ‘廣場名簡寫’ AFTER FULL_NAME;
?
修改表字段范例:
ALTER TABLE GATEWAY_PAYMENT_ORDER MODIFY COLUMN STAT varchar(2)? DEFAULT ‘0’?
comment ‘交易狀態?? 0:待支付/退款,1:等待第三方渠道回調,2:支付/退款成功,3:支付/退款失敗,4:支付/退款確認成功,5:支付/退款確認失敗,6;交易關閉,7:待收款(如果是此狀態-需要確認收款賬號是否正常),8:支付/退款確認成功-不可再進行其他操作,9:驗簽失敗,10:同步確認/買家已付款-等待賣家發貨WAIT_SELLER_SEND_GOODS,11:同步確認/賣家已發貨等待買家確認WAIT_BUYER_CONFIRM_GOODS’ AFTER DESCRIPTION;
?
?
2,SQL編寫
2.1,盡量使用單表查詢,避免多表JOIN。JOIN的后續ON條件不能用OR判斷,比如SELECT A.C1,B.C2 FROM A,B ON(A.ID=B.PID OR B.TAG=A.TAR_GET);? OR性能非常低,PS:我們線上一些打開緩慢的功能模塊都是因為這個OR的寫法導致的。
?
2.2,寫到應用程序的SQL語句,禁止一切DDL操作,例如:create,drop,alter,grant,remove;如有特殊需要,請與dba協商同意方可使用。
?
2.3,寫SQL的時候一定要給每個字段指定表名做前綴。比如select ub.id,ub.name from user_business ub where ub.create_date > ”;在iBatis的SQLMap文件中綁定變量使用”#var_name”表示,替代變量使用”$var_name$”;所有需要動態order by條件的查詢,在使用替代變量過程中,需要將可能傳入的內容以枚舉寫死在代碼中,禁止接受外部傳入內容。
?
2.4,如果需要事務的支持,在使用了innodb的情況下,在數據庫連接時候,先關閉自動提交,如: set auto_commit=0;?在寫java代碼的時候,在有事務處理的情況下,執行insert、delete、update后,commit;在exception代碼塊,必須寫上rollback操作。
?
2.5,不要寫select *類似的代碼,需要制定的字段名。
?
2.6,mysql的日期和字符是相同的,所以不需要像oracle那樣做另外的轉換,比如:
select? e.username from employee e where e.birthday>=’1998-12-31 11:30:45’。
?
2.7,避免在where字句中對字段施加函數,如果是業務要求的除外,但需要在編寫時候咨詢DBA。比如DATE_FORMAT(p.PAYMENT_DATE, ‘%Y-%m-%d’) >= DATE_FORMAT(‘2014-10-01’, ‘%Y-%m-%d’),就需要改正掉。
?
2.8,避免多余的排序,使用group by的時候,默認會進行排序,當你不需要排序的時候,可以使用order by null;
?
2.9,當表連接時候,用于連接的兩個表的字段如果數據類型不一致,則必須在一邊加上類型轉換的函數。杜絕mysql做隱式類型轉換的情況。
?
2.10,禁止在應用程序里面執行對數據庫的批量更新sql操作,如果需要請發email由dba判斷在合適的時間段里面在IDC的庫上手動人工執行。
3,基本原則
PS:表結構變更須由庫表所屬團隊發起。
?
1,所有在測試環境執行的表結構變更的SQL必須經過DBA review。
2,不允許物理刪除,不得使用存儲過程、觸發器以及視圖,特殊情況和業務場景申請DBA
?
PS:所有的規范都是適應自己的業務場景的,歡迎大家提出更好的建議,自己也會根據業務的發展,不斷總結擴展最契合的數據庫規范。
?以上就是MySQL 數據庫設計初步規范V1.0的內容,更多相關內容請關注PHP中文網(www.php.cn)!
?