知乎專欄 | 多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者” |
+------------+ +----------------+ +------------------+ | product | | product_store | | user_order | +------------+ +----------------+ +------------------+ |id | <--+ |id | <---+ |id | |price | +--1:1--o |product_id | | |user_id | |quantity | |sn | +--1:n--o |product_store_id | |... | |status | | | |category_id | +----------------+ +------------------+ +------------+
product 是產品表總表,product_store每個產品一條記錄,同時將sn編號對應到物理產品,這時記錄庫存需要
select count(id) from product_store where product_id='xxxxx' and status = 'sell'
商品銷售
begin; select id from product_store where status = 'sale' and product_id='xxxxx' for update; insert into user_order(user_id,product_store_id) values('xxxxxx','xxxxx'); update product_store set status = 'sold' where status = 'sale' and product_id='xxxxx'; commit;
售出的商品與用戶的訂單項一一對應的。
注意上面,這裡使用了排它鎖與事務處理,防止一個商品賣給兩個人。
根據上面的思路我們可以將商品屬性與product_store表進行一對一匹配,這樣每個商品都有它自己的商品屬性,甚至價格也可以移到product_store表中,例如不同顏色售價不同。