操作規范
- 如無說明,建表時一律采用innodb引擎;
- 如無說明,數據庫表編碼集(utf8,utf8_bin)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin - 如無備注,則表中的第一個id字段一定是主鍵且為自動增長;
- 如無備注,則數值類型的字段請使用UNSIGNED屬性;
- 如無備注,排序字段order_id在程序中默認使用降序排列;
- 如無備注,所有字段都設置NOT NULL,並設置默認值;
- 如無備注,所有的布爾值字段,如is_hot、is_deleted,都必須設置一個默認值,並設為0;
- 所有的數字類型字段,都必須設置一個默認值,並設為0;
- 針對varchar類型字段的程序處理,請驗證用戶輸入,不要超出其預設的長度;
- 建表時將數據字典中的字段中文名和屬性備注寫入數據表的備注中(“PK、自動增長”不用寫);
- 數據庫表結構修改操作都需要寫出對應的修改表結構的sql語句,發給數據庫管理人員。避免不同環境的數據庫表結構不統一
庫命名規范
線上環境、開發環境、測試環境數據庫內網域名遵循命名規范
業務名稱:xxx 線上環境:ali.×xx.db 預發布環境:ali.×xx.pdb 測試環境:ali.×xx.tdb 開發環境: ali.×xx.ddb 從庫在名稱后加-s標識,備庫在名稱后加-ss標識 線上從庫:ali.xxx-s.db 線上備庫:ali.xxx-ss.db 注: ali為公司名稱縮寫
表命名規范
規范
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 – 用戶
- category – 分類
- goods – 商品、產品等一切可交易網站的物品都用此命名
- good_gallery – 物品的相冊
- good_cate – 物品的分類,除了單獨作為表名,其他地方分類單詞一律用縮寫cate
- attr – 屬性
- article – 文章、新聞、幫助中心等以文章形式出現的,一般都用此命名
- cart – 購物車
- feedback – 用戶反饋
- order – 訂單
- site_nav – 包括頁頭和頁尾導航
- site_config – 系統配置表
- admin – 后台用戶 【RBAC標准表】
- role – 后台用戶角色【RBAC標准表】
- access – 后台操作權限,相當於action【RBAC標准表】
- role_admin – 后台用戶對應的角色【RBAC標准表】
- access_role – 后台角色對應的權限【RBAC標准表】
- 待續
范例
一張在線沖值記錄表:user_bank_deposit這個就非常符合標准,如果叫做userBankDeposit或是user_chongzhi,就非常不友好。
字段命名規范
規范
1.數據庫字段命名與表名命名類似:
2.使用小寫英文單詞,如果有多個單詞使用下划線隔開;
3.使用簡單單詞,避免生僻詞;
4.字段應當有注釋,描述該字段的用途及可能存儲的內容,如枚舉值則建議將該字段中使用的內容都定義出來;
5.是別的表的外鍵均使用xxx_id的方式來表明;
6.表的主鍵一般都約定成為id,自增類型;
7.時間字段,除特殊情況一律采用int來記錄unix_timestamp;
8.網絡IP字段,除特殊情況一律用bigint來記錄inet_aton值;
9.所有字段,均為非空,最好顯示指定默認值;
10.有些驅動對tinyint支持不夠好,通常建義按容量來選擇字段;
-
text字段盡量少用,或是拆到冗余表中;
-
可能關聯多個不同表的id的字段建議叫 RELATION_ID(關聯id) 時間以字段以 _TIME 后綴結尾 帶有標識的字段以 _FLAG 后綴結尾 自定義code碼字段以 _CODE 后綴結尾 所有使用0,1,2等字段代表特殊含義的需要在字段注釋中說明清楚,碼中說明清楚,修改了定義規則需要及時修改數據庫注釋。
約定
- 表名_id – 通常用作外鍵命名
- cid – 特殊的編號,帶有元數據,方便關聯查詢,你可以把它理解成類別(層次)編號。舉個例子,產品在分類時,往往需要將其歸類到子分類下,相應的字段中也一般只記錄子分類的id,這時若需要知道該產品屬於哪個主分類,就需要通過子分類信息再查詢到主分類信息,這是比較麻煩的,cid字段就是要解決這個問題。一般的站點幾十個分類肯定是夠用了,所以這里假設某一主分類的cid為11,則子分類的cid從1101開始編號,處理時只需截取前兩位數值便可知道該產品屬於哪一個主分類了。
- add_time – 添加時間、上架時間等
- last_time – 最后操作時間,如登錄、修改記錄
- expire_time – 過期時間
- name – 商品名稱、商家名稱等,不要跟title混用,title只用於文章標題、職稱等
- price – 價格
- thumb – 只要是列表頁面中的窗口圖,一律用此命名
- image_src – 相冊中的圖片地址一律用此命名,不要出現各種img,image,img_url,thumb_url等
- head_thumb – 用戶頭像, 雖然有點長,一定要遵守。不要出現上述情況
- image_alt – 相冊中圖片的alt屬性
- desc – 描述、簡介,比如goods_desc,不要出現goods_txt這種
- details – 詳情、文章內容等
- order_id – 排序
- telephone – 座機號碼
- mobile – 手機號碼
- phone – 當不區分手機和座機時,請用phone命名
- address – 地址,單獨出現不要用addr縮寫,組合出現時需用縮寫,比如mac地址,mac_addr
- zipcode – 郵編
- region – 地區,大的區域,比如記錄杭州市、溫州市等
- area – 區域,小的,比如上城區,江干區等
- avg_cost – 人均消費
- 待續
字段01標記
DEL_FLAG 邏輯刪除標記,0未刪除,1刪除
索引命名規范
規則
普通索引:IDX_字段名
唯一索引:IDX_UQE_字段名
組合索引:IDX_COM_字段名_字段名_字段名
添加索引sql 添加主鍵索引 ALTER TABLEtable_nameADD PRIMARY KEY (column) 添加唯一索引 ALTER TABLEtable_nameADD UNIQUE (column) 添加全文索引 ALTER TABLEtable_nameADD FULLTEXT (column) 添加普通索引 ALTER TABLEtable_nameADD INDEX index_name (column) 添加組合索引 ALTER TABLEtable_nameADD INDEX index_name (column1,column2,column3) 不需要使用索引情況: 表比較小,數據量不會多 賦值有限的列(枚舉),不要創建索引。創建的索引返回的行越少越好,此時區分度大。 用不上索引的列,不要創建索引。 長字符串的列,不要全部創建索引,但可以使用短索引(名字的頭8個字符)。 使用索引: 可能用到索引的地方:where 子句,order by,group by 索引有效的情況,使用如下篩選條件: <,<=,=,>,>=,between,in,like’admin%’,獨立索引+or+獨立索引+mysiam 索引失效 is not null 或 is null 索引會失效 not in 或<> 或!= like查詢是以%開頭,不使用索引。like ‘%admin’ 關聯表的id需要和關聯表中的id的字符集,排序集一致,否則關聯不會使用索引檢索。 or+innodb 字符類型在where子句中不加引號,不使用索引 對字段加函數或者運算的 在order by操作中,mysql只有在排序條件不是查詢條件表達式時才使用索引。盡管如此,在涉及多個數據表的查詢里,即使有索引可用,那些索引在加快ORDER BY操作方面也沒什么作用。 select 語句中字段中的子查詢是不使用索引的,除非添加必要的別的條件來使用索引。 如:SELECT scolumn.ID,( SELECT COUNT(ID)FROMS_COMMENT AS discuss WHERE discuss.RELEVANCE_ID = article.SEQUENCE_ID' AND discuss.CODE ='資訊平路') AS discussCount FROM S_COLUMN AS scolumn LEFT JOIN S_ARTICLE AS article ON scolumn.ID = article.COLUMN_ID LEFT JOIN S_COMMON_ARTICLE AS commonArticle ON commonArticle.ARTICLE_ID = article.ID 這個子查詢中 article.SEQUENCE_ID 和 RELEVANCE_ID都有索引確不會使用,而是用的是code的索引,所以要避免selec中子查詢。 連接查詢時,如果關聯字段排序字符集不一樣,則索引會失效,此點需在建表時注意。 如果mysql估計使用全表掃描要比使用索引快,則不使用索引。 比如:列id均勻的分布在1-100之間。下面的sql則不會使用索引 `select * from table_name where id > 1 and id<90;` 1