1. 程式人生 > >電商系統設計之商品(上)

電商系統設計之商品(上)

電商大夥每天都在用,類似某貓,某狗等。 電商系統設計看似複雜又很簡單,看似簡單又很複雜 本章適合初級工程師及中級工程師細看,大佬請隨意

1. 前言

商品的設計是電商系統中佔據重要地位,如何設計出高擴充套件,高效能的商品系統並非一件簡單的事情,我的設計是觀摩網際網路各大佬的設計後自行研究的,並非完全正確,但也不完全錯誤,現在我設計的這套電商系統已經在使用,如果在邏輯上遇到什麼問題,會及時修改我關於電商系統相關文章的設計思想部分。

2. 元素

見上圖,本次我們先講解下系統規格與自定義規格、系統屬性與自定義屬性的關於及其他們存在的意義。

2.1 SPU

SPU(Standard Product Unit)標準化產品單元

什麼叫標準化產品單元?

拋棄標準化一詞來看,產品單元?就是以一個產品為一個單位。例如你是手記銷售商,你在廠家進貨的時候說我要iphonex 100部型號隨意規格隨意,進貨的時候沒考慮到記憶體或者螢幕尺寸,這個時候你就把iphonex這個商品當作一個單位。這就是產品單位。再談標準化,只是一些人或一個人制定的這麼一個標準,所以稱為標準化產品單元,不要拿百度百科上的解釋反駁我,我只是用更通俗易懂的方式解釋一下SPU。

例如iphonex的價格也不同的地方,分別為iphonex 64g 是8888,iphonex 256g是18888。這個時候我們不能建立2個spu去管理這2個商品。這個時候就需要用到spu的概念了。

2.2 SKU

SKU(Stock Keeping Unit)庫存量單元

什麼叫庫存量單位?

字面意思來看,庫存則是指的某個商品的某個規格還有多少件,這個時候就不能只針對商品了。上面的例子iphonex有2個不同規格的商品,這個時候無法計算其每個規格的庫存(建立2個商品可是不切實際,未來管理會很複雜,就例如安踏的跑鞋有十幾個尺碼,難道要建立十幾個商品嗎?),此時只能針對當前商品再建立子商品,我們叫它規格,例如iphonex 有 儲存和顏色2個規格

有木有發現還是有點問題?那具體的儲存大小與具體顏色該如何表達呢?這個時候需要建立規格的子商品,我們稱他為屬性

這個每個屬性的結合則就是一個新的商品,我們稱它為SKU,一個SPU對應著N個SKU

這樣就生成了N個商品

  • iphonex 64G白色

  • iphonex 32G黑色

  • iphonex 256G白色 等等…

2.3 系統規格/屬性

為什麼要設立系統規格屬性呢?

盜用一張淘寶的圖,以上都是根據分類品牌設定好的規格及屬性

主要是為了方便商家新增商品及其對商品的規格屬性進行統一的管理,當然一個電商系統在前期運營的情況下儘量減少系統屬性規格的使用(方便商家入住嘛)。

自定義屬性就不用說了。不讓商家新增自己的規格和尺碼什麼的怎麼能行?

3. 資料

具體資料表的設計如下

3.1 product

商品表 (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;

3.2 system_attribute

系統規格表

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;

3.3 system_attribute_option

系統屬性表

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;

3.4 product_attribute_and_option

規格屬性繫結表

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;

3.5 product_sku

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;

3.6 product_attribute

自定義規格表

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;

4. 致謝

其實在商品的設計層面看懂後還是很簡單的,後續文章主要講解的更多的是這些資料該如何儲存更合理。如果設計不合理例如商品新增很簡單,但是修改商品就很複雜。在前期設計上我們要儘量避免這些“坑”

謝謝你看到這裡,希望我的文章能夠幫助到你。有什麼問題可以在評論區留言,我看到會第一時間回覆。謝謝