商品多規(guī)格
最近面試的時候遇到一個問題,大概意思是說商城一件衣服,顏色有藍、白、黑,尺碼有 S、M、L 碼,不同的顏色和尺碼搭配的價格和庫存是不一樣的,這種關系如何設計數(shù)據(jù)庫呢?

之前也沒用遇到過這種問題,第一感覺就是以衣服表為主表,再分表建立子表:顏色表和尺碼表以及顏色-尺碼管理表。
商品表字段(item):id name…
顏色表字段(color):id name item_id …
尺碼表字段(chima):id name item_id …
顏色-尺碼表(c-c):id item_id color_id chima_id number price …
回來后上網(wǎng)搜索了相關的內(nèi)容,發(fā)現(xiàn)其實早就有這種 庫存 SKU 的文章和設計,關于上面的問題有如下的具體解決方案
商品的無限規(guī)格實現(xiàn)
我們發(fā)現(xiàn)上面的衣服的庫存量單位(SKU)便不再是該商品, 而是到具體屬性組合出的規(guī)格, 每種規(guī)格可能會有不同的售價、運費與庫存剩余情況, 所以用戶在購買時, 不僅需要記錄所購買的商品 ID, 同時也需要記錄購買的該商品的具體規(guī)格 。
直觀分析圖示中的規(guī)格情況, 尺碼、顏色屬于衣服不同屬性的名稱, 與之對應的為屬性可選擇的的具體值, 屬于一對多關系, 在 MySQL 數(shù)據(jù)庫表結構中反應出為:

插入數(shù)據(jù)后:

symbol 字段是對指定商品 ID 下的屬性值的一個序號標記, 是為了提高在后面使用到時的檢索效率。該值在不同商品間可以重復, 在同一商品的屬性中需要保證唯一。 以上就完成了商品 ID 為 128 的商品多屬性的存儲工作。 為了能夠記錄和快速查詢出每種屬性組合出的商品的價格、庫存等信息, 我們還需要張表來維護這部分數(shù)據(jù), 建立 item_sku 表:

將示例中具有三種顏色、三種尺碼的屬性數(shù)據(jù)生成 SKU 后的 item_sku 表數(shù)據(jù)圖示:

從圖中數(shù)據(jù)看出, 該商品共有 9 種不同規(guī)格可選, 那么這時在確定用戶選擇的某種規(guī)格的價格等信息時只需一條 SQL 語句即可完成:

總結
如何屬性規(guī)則再多,也可以利用上述方法,如果設計運費還可以在 SKU 表中加入運費字段。