MYSQL數據庫設計規範 原

http://www.cnblogs.com/lovekingly/p/5044278.html MYSQL數據庫設計規範

1、數據庫命名規範
    採用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線'_'組成;
    命名簡潔明確(長度不能超過30個字符);
    例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log給數據庫加個前綴;
    除非是備份數據庫可以加0-9的自然數:user_db_20151210;
     
2、數據庫表名命名規範
    採用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線'_'組成;
    命名簡潔明確,多個單詞用下劃線'_'分隔;
    例如:user_login, user_profile, user_detail, user_role, user_role_relation,
        user_role_right, user_role_right_relation
    表前綴'user_'可以有效的把相同關係的表顯示在一起;
     
3、數據庫表字段名命名規範
    採用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線'_'組成;
    命名簡潔明確,多個單詞用下劃線'_'分隔;
    例如:user_login表字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time;
    每個表中必須有自增主鍵,add_time(默認系統時間)
    表與表之間的相關聯字段名稱要求儘可能的相同;
 
4、數據庫表字段類型規範
    用盡量少的存儲空間來存數一個字段的數據;
    例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);
    IP地址最好使用int類型;
    固定長度的類型最好使用char,例如:郵編;
    能使用tinyint就不要使用smallint,int;
    最好給每個字段一個默認值,最好不能爲null;
 
5、數據庫表索引規範
    命名簡潔明確,例如:user_login表user_name字段的索引應爲user_name_index唯一索引;
    爲每個表創建一個主鍵索引;
    爲每個表創建合理的索引;
    建立複合索引請慎重;
     
6、簡單熟悉數據庫範式
    第一範式(1NF):字段值具有原子性,不能再分(所有關係型數據庫系統都滿足第一範式);
        例如:姓名字段,其中姓和名是一個整體,如果區分姓和名那麼必須設立兩個獨立字段;
     
    第二範式(2NF):一個表必須有主鍵,即每行數據都能被唯一的區分;
        備註:必須先滿足第一範式;
     
    第三範式(3NF):一個表中不能包涵其他相關表中非關鍵字段的信息,即數據表不能有沉餘字段;
        備註:必須先滿足第二範式;
     
    備註:往往我們在設計表中不能遵守第三範式,因爲合理的沉餘字段將會給我們減少join的查詢;
          例如:相冊表中會添加圖片的點擊數字段,在相冊圖片表中也會添加圖片的點擊數字段;

MYSQL數據庫設計原則

1、核心原則
    不在數據庫做運算;
    cpu計算務必移至業務層;
    控制列數量(字段少而精,字段數建議在20以內);
    平衡範式與冗餘(效率優先;往往犧牲範式)
    拒絕3B(拒絕大sql語句:big sql、拒絕大事物:big transaction、拒絕大批量:big batch);

2、字段類原則
    用好數值類型(用合適的字段類型節約空間);
    字符轉化爲數字(能轉化的最好轉化,同樣節約空間、提高查詢性能);
    避免使用NULL字段(NULL字段很難查詢優化、NULL字段的索引需要額外空間、NULL字段的複合索引無效);
    少用text類型(儘量使用varchar代替text字段);
 
3、索引類原則
    合理使用索引(改善查詢,減慢更新,索引一定不是越多越好);
    字符字段必須建前綴索引;
    不在索引做列運算;
    innodb主鍵推薦使用自增列(主鍵建立聚簇索引,主鍵不應該被修改,字符串不應該做主鍵)(理解Innodb的索引保存結構就知道了);
    不用外鍵(由程序保證約束);
 
4、sql類原則
    sql語句儘可能簡單(一條sql只能在一個cpu運算,大語句拆小語句,減少鎖時間,一條大sql可以堵死整個庫);
    簡單的事務;
    避免使用trig/func(觸發器、函數不用客戶端程序取而代之);
    不用select *(消耗cpu,io,內存,帶寬,這種程序不具有擴展性);
    OR改寫爲IN(or的效率是n級別);
    OR改寫爲UNION(mysql的索引合併很弱智);
        select id from t where phone = ’159′ or name = ‘john’;
        =>
        select id from t where phone=’159′
        union
        select id from t where name=’jonh’
    避免負向%;
    慎用count(*);
    limit高效分頁(limit越大,效率越低);
    使用union all替代union(union有去重開銷);
    少用連接join;
    使用group by;
    請使用同類型比較;
    打散批量更新;
     
5、性能分析工具
    show profile;
    mysqlsla;
    mysqldumpslow;
    explain;
    show slow log;
    show processlist;

https://segmentfault.com/a/1190000007616456

命名規範

表名字段名均使用小寫字母,單詞間以下劃線分割。

表名字段名長度禁止超過32個字符,最大支持爲64個字符,爲了統一規範,易於查詢,超過的單詞儘量可讀縮略的形式進行書寫。

普通索引名稱以 idx_ 開頭,唯一索引以 uk_ 開頭。

外鍵儘量以被引用表名稱加 _id 組成。

基礎規範

統一使用 INNODB 存儲引擎,除非某些特定原因再行商議。

表字符集統一使用 UTF8,UTF8 字符集存儲漢字佔用3個字節,存儲英文字符佔用一個字節,如果emoji等表情符號的存儲需求,可申請使用 UTF8MB4 字符集。

字段統一添加註釋,id 可除外,type 型需指明主要值的含義,如”1 公開課,2 線上課”。

使用 timestamp 存儲時間。

表必需指定主鍵,儘量採用自增方式。

不強制使用外鍵約束,此過程由業務端實現,提高性能。

能不用 NOT IN 就不用 NOT IN,會把空和NULL給查出來。

儘可能少的使用 TEXT、BLOB 類型。

索引優化規範

對於複雜的查詢,執行 explain,查看索引使用情況。

重要的 SQL 必須被索引,比如 UPDATE、DELETE 語句的WHERE條件列 ORDER BY、GROUP BY、DISTINCT的字段。

不在低基數列上建立索引,例如“性別”。

如果是索引字段,一定要定義爲not null,因爲 null 值會影響 cordinate 統計,影響優化器對索引的選擇,不能保證有值,設置相應的默認值。

單表索引個數儘量限制在5個以內。

避免使大表的 JOIN。

最左前綴原則,mysql 使用聯合索引時,從左向右匹配,遇到斷開或者範圍查詢時,無法用到後續的索引列。

儘量減少直接使用 SELECT * 讀取全部字段。

使用 like 模糊匹配,%不要放首位。

本文參考

互聯網MySQL開發規範[http://blog.51cto.com/wangwei007/1709769]

MySQL數據庫開發規範[http://seanlook.com/2016/05/11/mysql-dev-principle-ec/]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章