1 mysql表結(jié)構(gòu)設(shè)計規(guī)范
1.1 適用場景
存儲主要業(yè)務(wù)信息,默認使用此數(shù)據(jù)庫。
1.2 設(shè)計要求
(1)表名
同一個業(yè)務(wù)的相關(guān)表建議表名前綴一致,如系統(tǒng)表相關(guān)表名:t_system_xxx_xxx
(2)表字段長度
表名、字段名,長度不得超過30位
(3)主鍵
必須創(chuàng)建數(shù)據(jù)庫存儲主鍵id:字段類型需選用bigint(20),采用數(shù)據(jù)庫自增方式生成(也可根據(jù)數(shù)據(jù)量多少定義為int、tinyint)。主鍵不允許在程序中使用,僅作為數(shù)據(jù)存儲使用。
必須創(chuàng)建數(shù)據(jù)庫業(yè)務(wù)主鍵pid:字段類型需選用char(32),程序中主鍵查詢記錄,均通過此業(yè)務(wù)主鍵。業(yè)務(wù)主鍵,采用UUD(不帶中間-),java端可通過工具類生成。需為此字段創(chuàng)建索引(唯一索引)。
如下:
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '數(shù)據(jù)主鍵',
`pid` char(32) NOT NULL COMMENT '業(yè)務(wù)主鍵',
(4)時間字段
時間類型,均使用無符號 int(10) 。
(5)浮點字段
浮點型字段(如各種金額),根據(jù)小數(shù)點精度要求,和對應(yīng)的數(shù)據(jù)場景,有如下兩種類型設(shè)置(為數(shù)據(jù)統(tǒng)一,無特殊情況,均設(shè)置為如下幾種類型)。
業(yè)務(wù)類型金額:
decimal(11,2)、decimal(13,4)
統(tǒng)計類型金額:
decimal(21,2)、decimal(21,4)
且無特殊要求,需為無符號。
(6)狀態(tài)字段
狀態(tài)相關(guān)字段,建議使用tinyint。
使用tinyint需注意,除非研發(fā)人員清楚tinyint(1)映射的是mysql中的bool類型,否則,tinyint類型字段長度需大于等于2。
(7)整型字段
如無特殊要求。int等數(shù)值字段無特殊要求,需為無符號。
(8)字符型字段
長度:
如字符型字段長度不會很長,varchar類型字段的長度,一般不超過255。
注:255及以內(nèi),使用一個字節(jié)存儲字段長度。超過255,使用兩個字節(jié)存儲字段長度。
約束:
對字符類型的字段(varchar,char,text)要求加約束:not null default '',即非null,默認為''。
需注意:如果某個varchar字段,必須要求為not null 。且字段內(nèi)容,必須從java程序中獲?。ǘ皇峭ㄟ^數(shù)據(jù)庫的default''生成),如果寫入數(shù)據(jù)庫時,java程序中這個字段為空,數(shù)據(jù)庫層面需要報錯。
這種情況建議:只加約束not null,不要使用not null default '',否則,程序中這個字段為空時,仍然會insert到表中(數(shù)據(jù)庫默認值為'')。not null的意義不存在了。
同時需注意:如果線上數(shù)據(jù),增加not null的字段時,如果表比較大,主從同步需要很長時間,一定要慎重,否則,會數(shù)據(jù)無法正常寫入到數(shù)據(jù)庫中。
索引:
varchar字段長度超過20,不可創(chuàng)建索引。如長度超過20,需要創(chuàng)建索引,只能創(chuàng)建長度為20的前置索引。
如長度超過20,需要創(chuàng)建完整的索引,可以使用crc32等函數(shù),對內(nèi)容進行編碼,存到一個額外的字段中,通過此編碼后字段,進行=查詢,查詢出結(jié)果后,再通過原有字段進行判斷(避免hash沖突)。
(9)建表必須字段
創(chuàng)建表必須加的字段:
創(chuàng)建時間:create_date(無符號,int 10)
更新時間:update_date(無符號,int 10)
如需添加“創(chuàng)建人ID”、“創(chuàng)建人名稱”、“更新人ID”、“更新人名稱”。字段名稱需固定:
`create_user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '創(chuàng)建人名稱',
`create_user_id` varchar(36) NOT NULL DEFAULT '' COMMENT '創(chuàng)建人ID',
`create_date` int(10) unsigned NOT NULL COMMENT '創(chuàng)建時間',
`update_user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '更新人名稱',
`update_user_id` varchar(36) NOT NULL DEFAULT '' COMMENT '更新人ID',
`update_date` int(10) unsigned NOT NULL COMMENT '更新時間',
邏輯刪除字段:
如需要此字段,建議此字段定義如下:
`del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否刪除,0正常,1刪除'
(10) 關(guān)聯(lián)查詢
無特殊情況,建議,關(guān)聯(lián)查詢表,不得超過3個。
大表的關(guān)聯(lián)查詢,研發(fā)需使用explain分析查詢
(11)字典相關(guān)
如基礎(chǔ)字典的名稱會發(fā)生變動,相關(guān)聯(lián)的業(yè)務(wù)表,值存儲字典的code。不存儲字典名稱字段,防止字典名稱變動后對業(yè)務(wù)數(shù)據(jù)的影響。
(12)關(guān)聯(lián)更新
無特殊情況,不建議關(guān)聯(lián)更新,即不建議update時,關(guān)聯(lián)多個表。
除非研發(fā),非常了解更新語句對數(shù)據(jù)的影響(避免出現(xiàn)只更新部分數(shù)據(jù)的情況)
2 mongo表結(jié)構(gòu)設(shè)計規(guī)范
2.1 適用場景
日志、臨時表等不關(guān)鍵的信息(弱化mongo的存儲)。
如使用此數(shù)據(jù)庫,需將使用場景及表結(jié)構(gòu),進行評估。
2.2 設(shè)計要求
(1)表名
同一個業(yè)務(wù)的相關(guān)表建議表名前綴一致,如系統(tǒng)表相關(guān)表名:t_system_xxx_xxx
(2)主鍵
mongo自動生成的主鍵_id,不得更改。
如需要自定義業(yè)務(wù)主鍵,可以創(chuàng)建字段:pid
(3)定義
所有的mongo表,均需創(chuàng)建映射實體類。
可統(tǒng)一在映射實體類中創(chuàng)建相同的通用屬性,如不使用,可以不設(shè)置值。
/**
* 刪除標志(false:正常;true:刪除)
*/
private Boolean delFlag;
/**
* 創(chuàng)建人ID
*/
private String createUserId;
/**
* 創(chuàng)建人姓名
*/
private String createUserName;
/**
* 創(chuàng)建時間
*/
private Integer createDate;
/**
* 更新人ID
*/
private String updateUserId;
/**
* 更新人姓名
*/
private String updateUserName;
/**
* 更新時間
*/
private Integer updateDate;