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