商城 商品模組 資料庫 表設計
要實現一個商城,對於商品模組中的資料庫表設計不懂,主要是:相同類別的產品的產品引數相同,不同類別的不同,這裡就不懂要怎麼設計了,所以上網找幾篇部落格瞭解
什麼是SPU、SKU、ARPU
這是一篇存檔性筆記,我自己存檔一下對這3個詞的理解。如果你已經明瞭了這3個詞的意思,請直接忽略之
首先,搞清楚商品與單品的區別。例如,iphone是一個單品,但是在淘寶上當很多商家同時出售這個產品的時候,iphone就是一個商品了。
商品:淘寶叫item,京東叫product,商品特指與商家有關的商品,每個商品有一個商家編碼,每個商品下面有多個顏色,款式,可以有多個SKU。
SPU = Standard Product Unit (標準化產品單元)
- 1
SPU是商品資訊聚合的最小單位,是一組可複用、易檢索的標準化資訊的集合,該集合描述了一個產品的特性。通俗點講,屬性值、特性相同的商品就可以稱為一個SPU。
例如,iphone4就是一個SPU,N97也是一個SPU,這個與商家無關,與顏色、款式、套餐也無關。以化妝品為例,下圖是拍拍商城給出的SPU資訊:
在商品資訊電子化過程中,商品的特性可以由多個“屬性及對應的屬性值對”進行描述。“屬性及對應的屬性值對”完全相同的商品,可以抽象成為一個SPU。同 時,這些“屬性及對應的屬性值對”也在SPU中固化下來,逐步標準化。基於SPU的商品資訊結構,可以實現豐富的應用,比如商品資訊與資訊、評論、以及其 它SPU的整合。
P.s:從這個意義上講,我認為比較購物的產品庫以SPU為標準來建立是最合適的。
SKU=stock keeping unit(庫存量單位)
SKU即庫存進出計量的單位, 可以是以件、盒、托盤等為單位。在服裝、鞋類商品中使用最多最普遍。 例如紡織品中一個SKU通常表示:規格、顏色、款式。
也有人解釋說SKU就是庫存的最小單位,在服裝行業,正常情況是“單款單色單碼”,國內品牌有把“單款單色”當做一個SKU、也有把“單款”的幾個色當一個SKU、也有把一塊麵料的幾個個款式當一個SKU,這些都是誤讀。
同時,引申出另外一個概念:SKC:單款、單色。如果一定要打比方的話:SKC是一個桔子,SKU是一瓣桔子,但不管怎麼說,一個桔子是桔子,一瓣桔子也是桔子。
不過,SKU是物理上不可分割的最小存貨單元。在使用時要根據不同業態,不同管 理模式來處理。比如一香菸是50條,一條裡有十盒,一盒中有20支,這些單位就要根據不同的需要來設定SKU。比如倉儲批發式大賣場,一定是按照一箱來設 定的。普通大賣場一定是按照條來設定的。菸酒專賣店一定是按照盒來設定的。過去上海等地的街邊小店一定是按一支來設定的。這樣一支就是煙的最小零售單位。 但要根據自己的業態和服務模式來設定。
P.s:關於什麼是SKU、SKC,可以參考阿福先生的這篇部落格。
【總結一下】:SPU是標準化產品單元,區分品種;SKU是庫存量單位,區分單品;商品特指與商家有關的商品,可對應多個SKU。
ARPU=Average Revenue Per User(每使用者平均收入)
ARPU注重的是一個時間段內運營商從每個使用者所得到的利潤。因此,高階的使用者越多,ARPU越高。在這個時間段裡,從運營商的運營情況來看,ARPU值高說明利潤高,這段時間效益好。
原文地址:http://www.ikent.me/blog/3017
PHP商城 商品模組 資料庫 表設計
表關係:
分類表 <= 商品表 <= SKU表(庫存表)
分類表 <= 屬性名 <= 屬性值
商品表 <= 商品和屬性關係表 => 屬性名|屬性值
業務邏輯:
1.同一商品不同SKU庫存和售價不同.
2.不同型別的商品具有不同的屬性名和屬性值(如汽車和服飾),所以屬性需要支援後期新增和維護.
3.在某個商品分類下通過屬性篩選商品.
4.商家某件商品的銷量統計,該件商品內幾個不同SKU的銷量統計.
5.更多…
分類表:
(商品分類編號, 分類名稱, 父分類編號)
(1, 男裝, 0)
(2, 褲子, 1)
(3, 外套, 1)
(4, 內褲, 1)
(5, 襪子, 1)
商品表:
(商品編號, 商品名稱, 商品分類編號, 賣家編號, SPU銷量, 評論數)
(1, '褲子名', 2, 1, 0)
(2, '外套名', 3, 1, 0)
(3, '內褲名', 4, 1, 0)
(4, '襪子名', 5, 1, 0)
SKU表(庫存表):
(SKU編號, 商品編號, SKU屬性, 價格, 庫存, SKU銷量)
(1, 1, [1:1,2:3], 99, 400, 0) 其中 [1:1,2:3] 表示 "顏色為黑色,尺碼為X"
(2, 1, [1:1,2:4], 99, 200, 0) 其中 [1:1,2:4] 表示 "顏色為黑色,尺碼為XL"
(3, 1, [1:2,2:3], 99, 300, 0) 其中 [1:2,2:3] 表示 "顏色為白色,尺碼為X"
(4, 1, [1:2,2:4], 99, 100, 0) 其中 [1:2,2:4] 表示 "顏色為白色,尺碼為XL"
上面只列出商品1這個分類的4個SKU.
屬性名:
(屬性名編號, 屬性名, 商品分類編號, 父屬性編號)
(1, 顏色, 2, 0)
(2, 尺碼, 2, 0)
(3, 品牌, 2, 0)
上面只列出褲子這個分類的3個屬性名.
屬性值:
(屬性值編號, 屬性值, 屬性名編號)
(1, 黑色, 1)
(2, 白色, 1)
(3, X, 2)
(4, XL, 2)
(5, 七匹狼, 3)
(6, 九牧王, 3)
上面只列出褲子這個分類的6個屬性值.
商品和屬性關係表:
(自增編號, 商品編號, 屬性名編號, 屬性值編號)
(1, 1, 1, 1) 商品1顏色為黑色
(2, 1, 1, 2) 商品1顏色為白色
(3, 1, 2, 3) 商品1尺碼為X
(4, 1, 2, 4) 商品1尺碼為XL
上面只列出商品1的4個屬性關係.
商品和屬性篩選表:
(商品編號, 商品具有的屬性值編號)
(1, [1,2,3,4])
用SQL全文檢索實現篩選.
如:
select * from 商品表
inner join 商品和屬性篩選表
on 商品表.商品編號 = 商品和屬性篩選表.商品編號
where 商品表.商品分類編號 = 2
and 商品和屬性篩選表.商品具有的屬性值編號 MATCH '1 3'
order by 商品表.評論數 DESC LIMIT 10 OFFSET 20;
商品搜尋表:
(商品編號, 商品標題和內容)
(1, [無需詞典,二元分詞])
用SQL全文檢索實現搜尋.
裡面有這麼一些表結構設計思想:
名值: id, name, value (用於實現自定義欄位如屬性的儲存)
父子: id, pid (用於實現關係樹如分類和子分類的儲存)
其中”名值”的思想應該就是EAV(Entity-Attribute-Value)實體屬性值模型思想.
留意過WordPress資料表的也會看到類似設計:
wp_postmeta(meta_id,post_id,meta_key,meta_value)
wp_commentmeta(meta_id,comment_id,meta_key,meta_value)
wp_usermeta(umeta_id,user_id,meta_key,meta_value)
wp_options(option_id,option_name,option_value,autoload)
“父子”儲存無限極分類:
wp_term_taxonomy(term_taxonomy_id,term_id,taxonomy,parent)
上面提到的無需詞典的二元分次演算法示例:
<?php
function cws($str) {
//找出字串中的英文單詞和數字
if(preg_match_all('%[A-Za-z0-9_-]{1,}%', $str, $matches)) {
$arr = $matches[0];
}
//以非中文(中文包括簡體和繁體)進行正則分割
$sections = preg_split('%[^\x{4e00}-\x{9fa5}]{1,}%u', $str);
foreach($sections as $v) {
//注意:foreach中多次正則匹配會降低效能
switch(true) {
case ($v === ''): continue; break;
case (mb_strlen($v, 'UTF-8') < 3): $arr[] = $v; break;
case (preg_match_all('%[\x{4e00}-\x{9fa5}]%u', $v, $matches)):
//前後倆倆組合,實現冗餘分詞.
//如"中國好聲音"將被分詞為: 中國 國好 好聲 聲音
$size = count($matches[0]);
for($i = 0; $i <= $size-2; $i++) {
$word = '';
for($j = 0; $j < 2; $j++) {
$word .= $matches[0][$i+$j]; //echo $i.' '.$j.' '.$matches[0][$i+$j]."\n";
}
$arr[] = $word; //echo "\n";
}
break;
}
}
return array_unique($arr);
}