商城 商品模塊 數據庫 表設計


表關係:
分類表 <= 商品表 <= SKU表(庫存表)
分類表 <= 屬性名 <= 屬性值
商品表 <= 商品和屬性關係表 => 屬性名|屬性值

業務邏輯:
1.同一商品不一樣SKU庫存和售價不一樣.
2.不一樣類型的商品具備不一樣的屬性名和屬性值(如汽車和服飾),因此屬性須要支持後期添加和維護.
3.在某個商品分類下經過屬性篩選商品.
4.商家某件商品的銷量統計,該件商品內幾個不一樣SKU的銷量統計.
5.更多...php

分類表:
(商品分類編號, 分類名稱, 父分類編號)
(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); }
相關文章
相關標籤/搜索