轉——PHP 實現商品的無限規格實現思路

在電子商城項目開發中, 會存在同一種商品存在不同規格的情況, 如圖某型號手機在售賣時用戶可以選擇的不同規格:




這裏商品的庫存量單位(SKU)便不再是該商品, 而是到具體屬性組合出的規格, 每種規格可能會有不同的售價、運費與庫存剩餘情況, 所以用戶在購買時, 不僅需要記錄所購買的商品 ID, 同時也需要記錄購買的該商品的具體規格。

直觀分析圖示中的規格情況, 網絡類型、機身顏色、機身內存 屬於商品不同屬性的名稱, 與之對應的爲屬性可選擇的的具體值, 屬於一對多關係, 在 MySQL 數據庫表結構中反應出爲:

商品屬性名 CREATE TABLE `item_attr_key` ( `attr_key_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, # 主鍵, 自增 ID `item_id` INT(10) UNSIGNED NOT NULL, # 關聯到商品 `attr_name` VARCHAR(50) NOT NULL, # 屬性名稱 PRIMARY KEY (`attr_key_id`) ); # 商品屬性值 CREATE TABLE `item_attr_val` ( `attr_key_id` INT(10) UNSIGNED NULL DEFAULT NULL, # 對應 item_attr_key 表的 attr_key_id, 完成一對多關聯 `item_id` INT(10) UNSIGNED NULL DEFAULT NULL, # 關聯到商品 `symbol` INT(10) NULL DEFAULT NULL, # 屬性編碼 `attr_value` VARCHAR(255) NULL DEFAULT NULL # 屬性值 );

加入數據後表內容如圖:




symbol 字段是對指定商品 ID 下的屬性值的一個序號標記, 是爲了提高在後面使用到時的檢索效率。該值在不同商品間可以重複, 在同一商品屬性中需要保證唯一。

以上就完成了商品 ID 爲 6 的商品屬性的存儲工作。

爲了能夠記錄和快速查詢出每種屬性組合出的商品的價格、庫存等信息, 我們還需要張表來維護這部分數據, 建立 item_sku 表:

商品庫存量單位表 CREATE TABLE `item_sku` ( `sku_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, # 主鍵, 自增 ID `item_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', # 關聯到商品 `attr_symbol_path` VARCHAR(255) NOT NULL, # 屬性組合出的規格路徑 `price` DOUBLE(15,2) NOT NULL DEFAULT '0.00', # 價格 `freight` DOUBLE(15,2) NULL DEFAULT '0.00', # 運費 `stock` INT(10) UNSIGNED NOT NULL DEFAULT '0', # 庫存數量 PRIMARY KEY (`sku_id`) );

該表是用戶在添加完商品屬性後, 由系統負責生成的該商品所有的可以選擇的屬性組合方案, attr_symbol_path 字段即是該商品不同屬性值的 symbol 字段組合後的路徑, 用來指示該規格具體指代哪些屬性

如 attr_symbol_path 字段值爲 1,4,7, 則對應 item_attr_val 表中 item_sku.item_id = item_attr_val.item_id 條件下 symbol 字段值爲 1, 4, 7 的屬性組合: TD-LTE/FDD-LTE/TDS/WCDMA/EVDO/GSM - 深空灰 - 16GB。

將示例中具有三種網絡類型、三種機身顏色、三種機身內存的屬性數據生成 SKU 後的 item_sku 表數據圖示:




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

select * from `item_sku` where `item_id`=6 and `attr_symbol_path`='1,4,7';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章