1. 程式人生 > >商城 商品模組 資料庫 表設計

商城 商品模組 資料庫 表設計

要實現一個商城,對於商品模組中的資料庫表設計不懂,主要是:相同類別的產品的產品引數相同,不同類別的不同,這裡就不懂要怎麼設計了,所以上網找幾篇部落格瞭解


 

 


什麼是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); 
}