為了專案的穩定,**的高效,管理的便捷,在開發團隊內部會制定各種各樣的規範
這裡分享乙份我們定義的mysql開發規範,歡迎交流拍磚
資料庫物件
命名規範的物件是指資料庫schema、表table、索引index、約束constraints等的命名約定
資料庫物件命名原則
1. 命名使用具有意義的英文詞彙,詞彙中間以下劃線分隔
2. 命名只能使用英文本母、數字、下劃線
3. 避免用mysql的保留字如:call、group等
4. 所有資料庫物件使用小寫字母
1. 資料庫名不能超過30個字元
2. 資料庫命名必須為專案英文名稱或有意義的簡寫
3. 資料庫建立時必須新增預設字符集和校對規則子句。預設字符集為utf8(已遷移dumbo的使用utf8mb4)
4. 命名應使用小寫
1. 同乙個模組的表盡可能使用相同的字首,表名稱盡可能表達含義
2. 多個單詞以下劃線(_)分隔
3. 表名不能超過30個字元
4. 普通表名以t_開頭,表示為table,命名規則為t_模組名(或有意義的簡寫)_+table_name
5. 臨時表(運營、開發或資料庫人員臨時用作臨時進行資料採集用的中間表)命名規則:加上tmp字首和8位時間字尾(tmp_test_user_20181109)
6. 備份表(dba備份用作儲存歷史資料的中間表)命名規則:加上bak字首和8位時間字尾(bak_test_user_20181109)
7. 命名應使用小寫
1. 字段命名需要表示其實際含義的英文單詞或簡寫,單詞之間用下劃線(_)進行連線
2. 各表之間相同意義的字段必須同名
3. 欄位名不能超過30個字元
1. 生產使用的使用者命名格式為 code_應用
2. 唯讀使用者命名規則為 read_應用
資料庫物件設計規範
儲存引擎的選擇
如無特殊需求,必須使用innodb儲存引擎
字符集的選擇
如無特殊要求,必須使用utf8或utf8mb4
1. 不同應用間所對應的資料庫表之間的關聯應盡可能減少,不允許使用外來鍵對錶之間進行關聯,確保元件對應的表之間的獨立性,為系統或表結構的重構提供可能性
2. 表設計的角度不應該針對整個系統進行資料庫設計,而應該根據系統架構中元件劃分,針對每個元件所處理的業務進行資料庫設計
3. 表必須要有pk
4. 乙個欄位只表示乙個含義
5. 表不應該有重複列
6. 禁止使用複雜資料型別(陣列,自定義等)
7. 需要join的字段(連線鍵),資料型別必須保持絕對一致,避免隱式轉換
8. 設計應至少滿足第三正規化,儘量減少資料冗餘。一些特殊場景允許反正規化化設計,但在專案評審時需要對冗餘欄位的設計給出解釋
9. text欄位必須放在獨立的表中,用pk與主表關聯。如無特殊需要,禁止使用text、blob欄位
10. 需要定期刪除(或者轉移)過期資料的表,通過分表解決
11. 單表字段數不要太多,建議最多不要大於50個
12. mysql在處理大表時,效能就開始明顯降低,所以建議單錶物理大小限制在16gb,表中資料控制在2000w內
13. 如果資料量或資料增長在前期規劃時就較大,那麼在設計評審時就應加入分表策略
14. 無特殊需求,嚴禁使用分割槽表
int:如無特殊需要,存放整型數字使用unsigned int型。整型欄位後的數字代表顯示長度
datetime:所有需要精確到時間(時分秒)的字段均使用datetime
,不要使用timestamp型別
varchar:所有動態長度字串 全部使用varchar型別,類似於狀態等有限類別的字段,也使用可以比較明顯表示出實際意義的字串,而不應該使用int之類的數字來代替;varchar(n),n表示的是字元數而不是位元組數。比如varchar(255),可以最大可儲存255個字元(字元包括英文本母,漢字,特殊字元等)。但n應盡可能小,因為mysql乙個表中所有的varchar欄位最大長度是65535個位元組,且儲存字元個數由所選字符集決定。如utf8儲存乙個字元最大要3個位元組,那麼varchar在存放占用3個位元組長度的字元時不應超過21845個字元。同時,在進行排序和建立臨時表一類的記憶體操作時,會使用n的長度申請記憶體。(如無特殊需要,原則上單個varchar型字段不允許超過255個字元)
text:僅僅當字元數量可能超過20000個的時候,才可以使用text型別來存放字元類資料,因為所有mysql資料庫都會使用utf8字符集。所有使用text型別的字段必須和原表進行分拆,與原表主鍵單獨組成另外乙個表進行存放。如無特殊需要,嚴禁開發人員使用mediumtext、text、longtext型別
對於精確浮點型資料儲存,需要使用decimal,嚴禁使用float和double
如無特殊需要,嚴禁開發人員使用blob型別
如無特殊需要,字段建議使用not null屬性,可用預設值代替null
自增字段型別必須是整型且必須為unsigned,推薦型別為int或bigint,並且自增字段必須是主鍵或者主鍵的一部分
1. 索引必須建立在索引選擇性選擇性較高的列上,選擇性的計算方式為: select count(distinct(col_name))/count(*) from tb_name;如果結果小於0.2,則不建議在此列上建立索引,否則大概率會拖慢sql執行
2. 組合索引的首字段,必須在where條件中,對於確定需要組成組合索引的多個字段,建議將選擇性高的字段靠前放
3. 禁止使用外來鍵
4. text型別字段如果需要建立索引,必須使用字首索引
5. 單張表的索參數量理論上應控制在5個以內。經常有大批量插入、更新操作表,應盡量少建索引
6. order by,group by,distinct的字段需要新增在索引的後面,形成覆蓋索引
7. 盡量使用btree索引,不要使用其它型別索引
約束設計規範
1. pk應該是有序並且無意義的,盡量由開發人員自定義,且盡可能短,使用自增序列
2. 表中除pk以外,還存在唯一性約束的,可以在資料庫中建立以「uidx_」作為字首的唯一約束索引
3. pk欄位不允許更新
4. 禁止建立外來鍵約束,外來鍵約束由應用控制
5. 如無特殊需要,所有字段必須新增非空約束,即not null
6. 如無特殊需要,所有字段必須有預設值
1. 盡量避免使用select *,join語句使用select *可能導致只需要訪問索引即可完成的查詢需要回表取數
2. 嚴禁使用select * from table而不加任何where條件
3. mysql中的text型別字段儲存的時候不是和由其他普通字段型別的字段組成的記錄存放在一起,而且讀取效率本身也不如普通欄位塊。如果不需要取回text欄位,又使用了select *,會讓完成相同功能的sql所消耗的io量大很多,而且增加部分的io效率也更低下
4. 在取出欄位上可以使用相關函式,但應盡可能避免出現now(),rand(),sysdate(),current_user()等不確定結果的函式,在where條件中的過濾條件欄位上嚴禁使用任何函式,包括資料型別轉換函式
5. 所有連線的sql必須使用join … on …方式進行連線,而不允許直接通過普通的where條件關聯方式。外連線的sql語句,可以使用left join on的join方式,且所有外連線一律寫成left join,而不要使用right join
6. 分頁查詢語句全部都需要帶有排序條件,除非應用方明確要求不要使用任何排序來隨機展示資料
7. where條件中嚴禁在索引列上進行數**算或函式運算
8. 用in()/union替換or,並注意in的個數小於300
9. 嚴禁使用%字首進行模糊字首查詢:如:select id,val from table where val like 『%name』;可以使用%模糊字尾查詢如:select id,val from table where val like 『name%』
10. 嚴禁使用insert on duplicate key update、replace into、insert ignore
勵志的語句,值得收藏
1.我們太年輕 以致都不知道以後的時光竟然還有那麼長 長得足夠讓我忘記你 足夠讓我重新喜歡乙個人 就像當初喜歡你一樣 2。乙個人如果想做他喜歡的事情 就一定要做很多他不喜歡的事情 很多很多 3。我一點也不孤獨 因為我的世界只有我乙個人已經足夠熱鬧了 4。失敗的人有兩種 一種是什麼人的話都聼 一種是什...
值得收藏的csdn部落格
這個sbcsdn沒有收藏功能,加好友關注也是徒有其表,到時侯根本就找不到了,所以自己收藏吧!在此感謝一下各位。1 小田的專欄,c primer學習筆記 2 gzshun的專欄,c 學習 3 linux裝置驅動開發 linux驅動中的非同步通知 4 android 4.0 事件輸入 event inp...
值得收藏的js原型詳解
不格網 vbuge.com 起初,地是空虛混沌,淵面黑暗 這時候一切還是null 神說,要有原型,於是就有了prototype 原型從憑空產生,於是需要乙個指向於null的特徵,人們把這種特徵叫做隱式原型,即 proto 其實也就一種指向,表達的是自己從何而來,也就是 object.prototyp...