電商數據庫設計


電商數據庫設計

圍繞購物流程

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權限


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM