规格参数表结构
商品規格數據結構
樂優商城是一個全品類的電商網站,因此商品的種類繁多,每一件商品,其屬性又有差別。為了更準確描述商品及細分差別,抽象出兩個概念:SPU和SKU,了解一下:
SPU和SKU
SPU:Standard Product Unit (標準產品單位) ,一組具有共同屬性的商品集
SKU:Stock Keeping Unit(庫存量單位),SPU商品集因具體特性不同而細分的每個商品
以圖為例來看:
-
本頁的 華為Mate10 就是一個商品集(SPU)
-
因為顏色、內存等不同,而細分出不同的Mate10,如亮黑色128G版。(SKU)
可以看出:
-
SPU是一個抽象的商品集概念,為了方便后臺的管理。
-
SKU才是具體要銷售的商品,每一個SKU的價格、庫存可能會不一樣,用戶購買的是SKU而不是SPU
數據庫設計分析
思考并發現問題
弄清楚了SPU和SKU的概念區分,接下來我們一起思考一下該如何設計數據庫表。
首先來看SPU,大家一起思考下SPU應該有哪些字段來描述?
id:主鍵 title:標題 description:描述 specification:規格 packaging_list:包裝 after_service:售后服務 comment:評價 category_id:商品分類 brand_id:品牌似乎并不復雜,但是大家仔細思考一下,商品的規格字段你如何填寫?
不同商品的規格不一定相同,數據庫中要如何保存?
?
再看下SKU,大家覺得應該有什么字段?
id:主鍵 spu_id:關聯的spu price:價格 images:圖片 stock:庫存 顏色? 內存? 硬盤?碰到難題了,不同的商品分類,可能屬性是不一樣的,比如手機有內存,衣服有尺碼,我們是全品類的電商網站,這些不同的商品的不同屬性,如何設計到一張表中?
其實顏色、內存、硬盤屬性都是規格參數中的字段。所以,要解決這個問題,首先要能清楚規格參數。
分析規格參數
仔細查看每一種商品的規格你會發現:
雖然商品規格千變萬化,但是同一類商品(如手機)的規格是統一的,有圖為證:
華為的規格:
三星的規格:
SKU的特有屬性
SPU中會有一些特殊屬性,用來區分不同的SKU,我們稱為SKU特有屬性。如華為META10的顏色、內存屬性。
不同種類的商品,一個手機,一個衣服,其SKU屬性不相同。
同一種類的商品,比如都是衣服,SKU屬性基本是一樣的,都是顏色、尺碼等。
這樣說起來,似乎SKU的特有屬性也是與分類相關的?事實上,仔細觀察你會發現,SKU的特有屬性是商品規格參數的一部分:
也就是說,我們沒必要單獨對SKU的特有屬性進行設計,它可以看做是規格參數中的一部分。這樣規格參數中的屬性可以標記成兩部分:
-
spu下所有sku共享的規格屬性(稱為全局屬性)
-
每個sku不同的規格屬性(稱為特有屬性)
搜索屬性
打開一個搜索頁,我們來看看過濾的條件:
你會發現,過濾條件中的屏幕尺寸、運行內存、網路、機身內存、電池容量、CPU核數等,在規格參數中都能找到:
也就是說,規格參數中的數據,將來會有一部分作為搜索條件來使用。我們可以在設計時,將這部分屬性標記出來,將來做搜索的時候,作為過濾條件。要注意的是,無論是SPU的全局屬性,還是SKU的特有屬性,都有可能作為搜索過濾條件的,并不沖突,而是有一個交集:
規格參數表
表結構
我們看下規格參數的格式:
可以看到規格參數是分組的,每一組都有多個參數鍵值對。不過對于規格參數的模板而言,其值現在是不確定的,不同的商品值肯定不同,模板中只要保存組信息、組內參數信息即可。
因此我們設計了兩張表:
-
tb_spec_group:組,與商品分類關聯
-
tb_spec_param:參數名,與組關聯,一對多
規格組
規格參數分組表:tb_spec_group
CREATE TABLE `tb_spec_group` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',`cid` bigint(20) NOT NULL COMMENT '商品分類id,一個分類下有多個規格組',`name` varchar(50) NOT NULL COMMENT '規格組的名稱',PRIMARY KEY (`id`),KEY `key_category` (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='規格參數的分組表,每個商品分類下有多個規格參數組';規格組有3個字段:
-
id:主鍵
-
cid:商品分類id,一個分類下有多個模板
-
name:該規格組的名稱。
規格參數
規格參數表:tb_spec_param
CREATE TABLE `tb_spec_param` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',`cid` bigint(20) NOT NULL COMMENT '商品分類id',`group_id` bigint(20) NOT NULL,`name` varchar(255) NOT NULL COMMENT '參數名',`numeric` tinyint(1) NOT NULL COMMENT '是否是數字類型參數,true或false',`unit` varchar(255) DEFAULT '' COMMENT '數字類型參數的單位,非數字類型可以為空',`generic` tinyint(1) NOT NULL COMMENT '是否是sku通用屬性,true或false',`searching` tinyint(1) NOT NULL COMMENT '是否用于搜索過濾,true或false',`segments` varchar(1000) DEFAULT '' COMMENT '數值類型參數,如果需要搜索,則添加分段間隔值,如CPU頻率間隔:0.5-1.0',PRIMARY KEY (`id`),KEY `key_group` (`group_id`),KEY `key_category` (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COMMENT='規格參數組下的參數名';按道理來說,我們的規格參數就只需要記錄參數名、組id、商品分類id即可。但是這里卻多出了很多字段,為什么?
還記得我們之前的分析吧,規格參數中有一部分是 SKU的通用屬性,一部分是SKU的特有屬性,而且其中會有一些將來用作搜索過濾,這些信息都需要標記出來。
通用屬性
用一個布爾類型字段來標記是否為通用:
-
generic來標記是否為通用屬性:
-
true:代表通用屬性
-
false:代表sku特有屬性
-
搜索過濾
與搜索相關的有兩個字段:
-
searching:標記是否用作過濾
-
true:用于過濾搜索
-
false:不用于過濾
-
-
segments:某些數值類型的參數,在搜索時需要按區間劃分,這里提前確定好劃分區間
-
比如電池容量,0~2000mAh,2000mAh~3000mAh,3000mAh~4000mAh
-
數值類型
某些規格參數可能為數值類型,這樣的數據才需要劃分區間,我們有兩個字段來描述:
-
numberic:是否為數值類型
-
true:數值類型
-
false:不是數值類型
-
-
unit:參數的單位
總結
- 上一篇: 使用fastDFS客户端改造文件上传
- 下一篇: 规格参数组查询的代码实现