電商數據庫設計

電商數據庫設計

圍繞購物流程

mysql5.7
mysql SQLyog
Linux Shell腳本mysql

用戶登陸-選購商品-加購物車-檢查庫存-提交訂單-貨到付款-訂單付款-發貨sql

模塊設計

用戶模塊 用戶註冊登陸驗證
商品模塊 先後臺商品管理
訂單模塊 訂單購物車生成和管理
倉配模塊 倉庫庫存和物流的管理數據庫

數據庫設計規範

邏輯設計-物理設計
實際工做中 邏輯設計+物理設計
表名 字段名 字段類型網絡

數據庫字段設計規範
-數據庫對象名稱必須使用小寫字段 下劃線分隔 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權限

相關文章
相關標籤/搜索