電商大夥天天都在用,相似某貓,某狗等。
電商系統設計看似複雜又很簡單,看似簡單又很複雜
本章適合初級工程師及中級工程師細看,大佬請隨意
商品的設計是電商系統中佔據重要地位,如何設計出高擴展,高性能的商品系統並不是一件簡單的事情,個人設計是觀摩互聯網各大佬的設計後自行研究的,並不是徹底正確,但也不徹底錯誤,如今我設計的這套電商系統已經在使用,若是在邏輯上遇到什麼問題,會及時修改我關於電商系統相關文章的設計思想部分。iphone
見上圖,本次咱們先講解下系統規格與自定義規格、系統屬性與自定義屬性的關於及其餘們存在的意義。post
SPU(Standard Product Unit)標準化產品單元
什麼叫標準化產品單元?性能
拋棄標準化一詞來看,產品單元?就是以一個產品爲一個單位。例如你是手記銷售商,你在廠家進貨的時候說我要iphonex 100部型號隨意規格隨意,進貨的時候沒考慮到內存或者屏幕尺寸,這個時候你就把iphonex這個商品看成一個單位。這就是產品單位。再談標準化,只是一些人或一我的制定的這麼一個標準,因此稱爲標準化產品單元,不要拿百度百科上的解釋反駁我,我只是用更通俗易懂的方式解釋一下SPU。編碼
例如iphonex的價格也不一樣的地方,分別爲iphonex 64g 是8888,iphonex 256g是18888。這個時候咱們不能創建2個spu去管理這2個商品。這個時候就須要用到spu的概念了。url
SKU(Stock Keeping Unit)庫存量單元
什麼叫庫存量單位?spa
字面意思來看,庫存則是指的某個商品的某個規格還有多少件,這個時候就不能只針對商品了。上面的例子iphonex有2個不一樣規格的商品,這個時候沒法計算其每一個規格的庫存(建立2個商品但是不切實際,將來管理會很複雜,就例如安踏的跑鞋有十幾個尺碼,難道要建立十幾個商品嗎?),此時只能針對當前商品再建立子商品,咱們叫它規格,例如iphonex 有 存儲和顏色2個規格設計
有木有發現仍是有點問題?那具體的存儲大小與具體顏色該如何表達呢?這個時候須要建立規格的子商品,咱們稱他爲屬性code
這個每一個屬性的結合則就是一個新的商品,咱們稱它爲SKU,一個SPU對應着N個SKUblog
這樣就生成了N個商品排序
爲何要設立系統規格屬性呢?
盜用一張淘寶的圖,以上都是根據分類品牌設定好的規格及屬性
主要是爲了方便商家添加商品及其對商品的規格屬性進行統一的管理,固然一個電商系統在前期運營的狀況下儘可能減小系統屬性規格的使用(方便商家入住嘛)。
自定義屬性就不用說了。不讓商家添加本身的規格和尺碼什麼的怎麼能行?
具體數據表的設計以下
商品表 (spu表)
CREATE TABLE `product` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品標題', `category_id` int(11) NOT NULL COMMENT '商品分類編號', `mer_id` int(11) NOT NULL COMMENT '商家編號', `freight_id` int(11) DEFAULT NULL, `type_id` tinyint(4) NOT NULL COMMENT '類型編號', `sketch` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '簡述', `intro` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品描述', `keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品關鍵字', `tags` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '標籤', `marque` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品型號', `barcode` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '倉庫條碼', `brand_id` int(11) NOT NULL COMMENT '品牌編號', `virtual` int(11) NOT NULL DEFAULT '0' COMMENT '虛擬購買量', `price` decimal(8,2) NOT NULL COMMENT '商品價格', `market_price` decimal(8,2) NOT NULL COMMENT '市場價格', `integral` int(11) NOT NULL DEFAULT '0' COMMENT '可以使用積分抵消', `stock` int(11) NOT NULL COMMENT '庫存量', `warning_stock` int(11) NOT NULL COMMENT '庫存警告', `picture_url` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '封面圖', `posters` varchar(125) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `status` tinyint(4) NOT NULL COMMENT '狀態 -1=>下架,1=>上架,2=>預售,0=>未上架', `state` tinyint(4) NOT NULL DEFAULT '0' COMMENT '審覈狀態 -1 審覈失敗 0 未審覈 1 審覈成功', `is_package` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是不是套餐', `is_integral` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是不是積分產品', `sort` int(11) NOT NULL DEFAULT '99' COMMENT '排序', `deleted_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
系統規格表
CREATE TABLE `system_attribute` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `category_id` int(11) NOT NULL COMMENT '商品類別編號', `name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '屬性名稱', `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排列次序', PRIMARY KEY (`id`), KEY `product_attribute_category_id_name_index` (`category_id`,`name`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
系統屬性表
CREATE TABLE `product_attribute_option` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '選項名稱', `attr_id` int(11) NOT NULL COMMENT '屬性編碼', `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排序', PRIMARY KEY (`id`), KEY `product_attribute_option_name_attr_id_index` (`name`,`attr_id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
規格屬性綁定表
CREATE TABLE `product_attribute_and_option` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `sku_id` int(11) NOT NULL COMMENT 'sku編碼', `option_id` int(11) NOT NULL DEFAULT '0' COMMENT '屬性選項編碼', `attribute_id` int(11) NOT NULL COMMENT '屬性編碼', `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排序', `supplier_option_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `product_attribute_and_option_sku_id_option_id_attribute_id_index` (`sku_id`,`option_id`,`attribute_id`) ) ENGINE=InnoDB AUTO_INCREMENT=6335 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
sku表
CREATE TABLE `product_sku` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_id` int(11) NOT NULL COMMENT '商品編碼', `name` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'sku名稱', `img` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '主圖', `price` decimal(8,2) NOT NULL COMMENT '價格', `stock` int(11) NOT NULL DEFAULT '0' COMMENT '庫存', `code` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品編碼', `barcode` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品條形碼', `data` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'sku串', PRIMARY KEY (`id`), KEY `product_sku_name_product_id_index` (`name`,`product_id`) ) ENGINE=InnoDB AUTO_INCREMENT=530 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
自定義規格表
CREATE TABLE `product_attribute` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `product_id` int(11) NOT NULL COMMENT '商品編碼', `name` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '規格名稱', `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排序', PRIMARY KEY (`id`), KEY `product_supplier_attribute_name_product_id_index` (`name`,`product_id`) ) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
其實在商品的設計層面看懂後仍是很簡單的,後續文章主要講解的更多的是這些數據該如何存儲更合理。若是設計不合理例如商品添加很簡單,可是修改商品就很複雜。在前期設計上咱們要儘可能避免這些「坑」
謝謝你看到這裏,但願個人文章可以幫助到你。有什麼問題能夠在評論區留言,我看到會第一時間回覆。謝謝