電商數據庫設計
圍繞購物流程
mysql5.7
mysql SQLyog
Linux Shell腳本
用戶登錄-選購商品-加購物車-檢查庫存-提交訂單-貨到付款-訂單付款-發貨
模塊設計
用戶模塊 用戶注冊登錄驗證
商品模塊 前后台商品管理
訂單模塊 訂單購物車生成和管理
倉配模塊 倉庫庫存和物流的管理
數據庫設計規范
邏輯設計-物理設計
實際工作中 邏輯設計+物理設計
表名 字段名 字段類型
數據庫字段設計規范
-數據庫對象名稱必須使用小寫字段 下划線分隔 DbName not Equal dbname
-數據庫對象禁止使用mysql保留關鍵字
select id,username,from,age from tb_user 報錯
select id,username,from
,age from tb_user 不報錯
-數據庫對象命名見名識意 不超過32字符 用戶數據庫mc_userdb 用戶數據表user_account
-所有臨時表以tmp為前綴並且以日期為后綴
-備份庫 備份表必須以bak為前綴並以日期為后綴
-所有儲存相同數據的列名和列類型必須一致
-所有表是使用Innodb存儲引擎 支持事務 行級鎖 更好的恢復性 高並發下性能好
-數據庫和表的字符集統一使用UTF8
統一字符集可以避免由於字符集轉換成的亂碼
-使用comment從句添加表和列的注釋 數據字典的維護
-控制單表數據量的大小 控制在500w行內
-限制取決於存儲設置和文件系統
-分區表在物理上表現為多個文件 邏輯上為一個表
-謹慎選擇分區鍵 跨分區效率更低 物理分表方式管理大數據
-禁止表中使用預留字段
-禁止在數據庫中存儲圖片 文件等二進制數據
-禁止線上做數據庫壓力測試
-禁止開發測試環境連接生成環境數據庫
索引設計規范
-限制表索引數量 建議單張表索引不超過5個
-每個Innodb表必須有一個主鍵 不能使用頻繁更新的列作為主鍵
-不使用UUID MD5 HASH 字符串作為主鍵
-SELECT UPDATE DELETE語句的WHERE從句中的列包含在ORDER BY,GROUP BY,DISTINCT中的字段多表的關聯列
-避免建立冗余索引和重復
-對於頻繁查詢優先考慮覆蓋索引
-盡力避免使用外鍵
-外鍵用於保障數據參照完整性 建議在業務端實現
數據庫字段設計規范
-優先選擇符合存儲需要的最小的數據類型
-將字符串轉換為數字類型存儲
INET_ATON('255.255.255.255') = 4294967295
INET_NTOA(4294967295) = '255.255.255.255'
(字符串需要15個字節 int只需要4個字節)
-對於非負數數據采用無符號整型進行存儲
SIGNED INT -2147483648~2147483648
UNSIGNED INT 0~4213213123
-VARCHAR(N) 中的N代表的是字符數 不是字節數
使用UTF-8存儲漢字 Varchar(255) = 765個字節
-避免TEXT BLOG類型數據
-避免使用ENUM數據類型 (修改用ALTER )
-盡可能把所有列定義為NOT NULL (索引NULL需要增加額外空間)
-使用TIMESTAMP或者DATETIME存儲時間
TIMESTAMP 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07
超出時間用DATETIME
-數據類型
財務相關 decimal類型 計算時不會丟失精度
數據庫SQL開發規范
-充分利用表上已有的索引 避免使用雙%號的查詢條件 如:a like '%123%'
-一個sql只能利用到復合索引中的一列進行范圍查詢
-使用left join或者not exist優化not in操作
-設計時 對以后的數據庫擴展考慮
-程序連接不同的數據庫
-為數據庫遷移和分庫分表留余地
-禁止使用SELECT * 必須使用 SELCT <字段列表查詢> (會消耗更多的CPU和IO以及網絡帶寬資源) 可以減少表結構表化的影響
-禁止使用不含字段列表的INSERT語句
INSERT into t values('a','b','c');
INSERT into t(c1,c2,c3) values('a','b','c');
可以減少表結構表化的影響
-避免使用子查詢 可以把子查詢優化為join查詢(子查詢結果集無法使用索引)
子查詢會產生臨時表操作 子查詢數據量大會嚴重影響效率
-避免使用join關聯太多表 不要超過5個
-減少同數據的交互次數
數據庫更適合批量操作
合並多個相同的操作到一起 可以提高處理效率
alter table t1 add column c1 int,change column c2 c2 int
-使用in代替or
-禁止使用order by rand()隨機排序
會把表中符合條件的數據裝載到內存中排序 消耗大量CPU
推薦程序中獲取隨機值 然后從數據中獲取
-where從句中禁止對列進行函數轉換和計算
where date(createtime)= '20160901' 會無法使用索引
改為where createtime >= 20160901 and createtime < '20160902'
-明顯不會有重復值時使用UNION ALL而不是UNION
union會把所有數據放到臨時表中再操作 會去重操作
union all不會再對結果集重新操作
-拆分復雜的大sql為小sql
數據庫操作行為規范
-超過100w行的批量寫操作 要分批多次操作
大批量操作可能會造成嚴重主從延遲
避免產生大量日志
-對於大表使用pt-online-schema-change修改表結構
-禁止為程序使用的賬號使用super
-程序使用賬號只能在一個DB上使用 原則上不能有drop權限