[數據庫環境介紹]web
一般來說,各個互聯網公司的數據庫分爲5個數據庫環境:sql
1. dev : 開發環境, 開發可讀寫,可修改表結構; 經常使用的163的數據庫表; 開發人員能夠修改表結構, 能夠隨意修改其中的數據; 可是須要保證不影響其餘開發同事; 數據庫
2. qa : 測試環境, 開發可讀寫, 開發人員能夠經過工具修改表結構; 網絡
3. sim: 模擬環境, 開發可讀寫, 經過web平臺;發起上線請求時,會先在這個環境上進行預執行, 這個環境也可供部署上線演練或壓力測試使用 能夠讀寫;工具
4. real: 生產數據庫從庫(準實時同步),只讀環境,不容許修改數據,不容許修改表結構; 供線上問題查找,數據查詢等使用;post
5. online: 線上環境;開發人員不容許直接在線上環境進行數據庫操做,若是須要操做必須找DBA進行操做並進行相應記錄;測試
這些環境的機器,必定要作到權限劃分明確,讀寫賬號分離,而且有辨識度,能區分具體業務。例如用戶名w_wap, r_wap 能看出來,讀寫賬號是wap應用的。ui
[數據庫命名規範]spa
1. 儘可能簡潔明義,可以一眼看出來這個數據庫是用來作什麼的;unix
2. 使用名詞做爲數據庫名稱,而且只用英文,不用中文拼音;
3. 使用英文字母,所有小寫,控制在3-7個字母之內;
4. 若是有多個單詞,則使用下劃線隔開,不建義駝峯命名;
例如,每一個公司都有crm業務,那就叫作xx_crm, 字符集統一utf8。字符集踩過的坑不少,爲了通用性統一utf8。
create database xx_crm default character set=utf8;
[表命名規範]
1. 具有統一前綴,對相關功能的表應當使用相同前綴,如acl_xxx,house_xxx,ppc_xxx;其中前綴一般爲這個表的模塊或依賴主實體對象的名字,一般來說表名爲:業務_動做_類型,或是業務_類型;
2. 表名使用英文小寫單詞,若是有多個單詞則使用下劃線隔開;
3.表名簡介,使用常見單詞,避免使用長單詞和生僻詞;
4. 表引擎取決於實際應用場景及當前數據庫中的已經存在的存儲引擎;日誌及報表類表建議用myisam,與交易,審覈,金額相關的表建議用innodb引擎。整體來說數據庫默認innodb;
5. 數據表必須有主鍵,且建議均使用auto_increment的id做爲主鍵(與業務無關),和業務相關的要作爲惟一索引;
6. 默認使用utf8字符集(因爲數據庫定義使用了默認,數據表能夠再也不定義,但爲保險起見,建議都寫上);
7. 全部的表都必須有備註,寫明白這個表中存放的數據內容;
8. 預估表數據量,若是數據量較大(超過500w)則須要考慮分表策略。能夠等量均衡分表或根據業務規則分表都可。要分表的數據表必須與DBA商量分表策略;
9. 職責相近的表,命名規則應該相同;如合同申請,帳戶信息,交友相關等;
舉個例子,一張在線衝值記錄表:user_bank_deposit 這個就很是符合標準,若是叫作userBankDeposit或是user_chongzhi,就很是不友好。
CREATE TABLE `house_refresh_log` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID', `fangid` int(11) NOT NULL COMMENT '房貼子ID', `refresh_time` int(11) NOT NULL COMMENT '刷新時間', PRIMARY KEY (`id`), UNIQUE KEY `fangid` (`fangid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='房刷新記錄表'
[字段命名規範]
1. 數據庫字段命名與表名命名相似:
2. 使用小寫英文單詞,若是有多個單詞使用下劃線隔開;
3. 使用簡單單詞,避免生僻詞;
4. 字段應當有註釋,描述該字段的用途及可能存儲的內容,如枚舉值則建議將該字段中使用的內容都定義出來;
5. 是別的表的外鍵均使用xxx_id的方式來代表;
6. 表的主鍵通常都約定成爲id,自增類型;
7. 時間字段,除特殊狀況一概採用int來記錄unix_timestamp;
8. 網絡IP字段,除特殊狀況一概用bigint來記錄inet_aton值;
9. 全部字段,均爲非空,最好顯示指定默認值;
10. 有些驅動對tinyint支持不夠好,一般建義按容量來選擇字段;
11. text字段儘可能少用,或是拆到冗餘表中;
CREATE TABLE `wanted_post` ( `id` int(10) NOT NULL AUTO_INCREMENT, `puid` int(10) unsigned NOT NULL, `user_id` int(10) NOT NULL COMMENT '發貼用戶的id', `username` varchar(50) NOT NULL COMMENT '發貼用戶的用戶名', `city` smallint(4) NOT NULL COMMENT '所在城市', `ip` bigint(14) NOT NULL COMMENT '發帖人的ip', `district_id` tinyint(2) NOT NULL COMMENT '所在區域的id', `district_name` varchar(20) NOT NULL COMMENT '行政區名字', `street_id` tinyint(2) NOT NULL COMMENT '所在街道(地標)的id', `street_name` varchar(20) NOT NULL COMMENT '小區名字', `title` varchar(255) NOT NULL COMMENT '帖子的標題', `description` text NOT NULL COMMENT '帖子詳情描述', `post_at` int(11) NOT NULL COMMENT '用戶發帖時間,數據建立的時間,使用整型存儲', `refresh_at` int(11) NOT NULL COMMENT '帖子被修改的時間,整型存儲', `show_time` int(11) NOT NULL COMMENT '帖子顯示時間', `age_max` int(11) NOT NULL DEFAULT '0' COMMENT '招聘最小年齡', `age_min` int(11) NOT NULL DEFAULT '0' COMMENT '招聘最大年齡', `post_refresh_at` int(11) NOT NULL COMMENT '刷新時間', PRIMARY KEY (`id`), UNIQUE KEY `idx_puid` (`puid`), KEY `user_id_index` (`user_id`), KEY `post_at_index` (`post_at`), KEY `refresh_at_index` (`refresh_at`), KEY `show_time_index` (`show_time`) ) ENGINE=InnoDB AUTO_INCREMENT=55295 DEFAULT CHARSET=utf8 COMMENT='招聘帖子表'