這部分的設計必然少不了會有商品、貨品、規格、規格值表。html
先說下我對四個表之間關係設計:html5
商品與貨品是一對多的關係。算法
規格與規格值是一對多的關係。數據庫
就這兩種關係,關係很清晰,其實我剛開始的設計是這樣的:json
商品與貨品是一對多的關係。jsp
規格與規格值是一對多的關係。編輯器
商品與規格是多對多的關係。post
商品與規格之間的中間表與規格值是多對多的關係。編碼
貨品與規格值是多對多的關係。spa
五種關係,看着都讓人頭疼,而這仍是簡單的狀況下,好比客戶要求商品發佈時規格值名字是可手動修改的,那這時咱們的"商品與規格之間的中間表與規格值是多對多的關係"就要修改它們的中間表了(中間表新增名稱字段)。
真是剪不斷,理不亂,我想了想因而決定使用字符串來保持它們之間的關係("保持它們之間的關係"可能說成"保存我方須要的對方的數據"更合理)。
讓本來的規格與規格值表與商品表不直接關聯(想象下規格就是規格,只是供商品發佈時作爲選項而存在的,而商品只是須要規格來完善本身,商品完善後規格的生和滅(從數據庫中刪除)與我無關了,這感受很合理很正常),而是使用json字符串保存用戶所想要的規格數據,貨品表也同樣,再也不與規格值關聯,而是選擇使用json字符串。
這麼一來就獲得剛開始說的那種只有兩種關係了,下面說下商品與貨品:
假設咱們的商品規格是這樣一個字段爲productSpecs的json:[{id:0,name:顏色,solr:0,specValues:[{id:0,name:藍色,pic:blue.jpg},{id:1,name:紅色,pic:red.jpg}]},{id:1,name:尺碼,solr:1,specValues:[{id:2,name:10},{id:3,name:20}]}]
假設咱們的貨品1規格值是這樣一個goodsKeys的json:[{id:0},{id:2}],貨品2規格值是這樣一個json:[{id:0},{id:3}]
當用戶瀏覽商城主頁點擊一個商品查看商品詳情時,後臺會查詢對應的商品數據展現到詳情頁,別的數據就不說了,就說規格選項那塊,好比選項以下表:
顏色 | ||
藍色 | 紅色 | |
尺碼 | ||
10 | 20 |
說下面以前,咱們能夠先想象一下每個貨品都有一把鎖(goodsKeys),等待着用戶去解鎖,而解鎖的鑰匙都在商品那裏(productSpecs)。
關於上面那個表是如何出現的呢?假設我用JavaScript代碼寫個案例給大家看下:
//var productSpecs= [{id:0,name:顏色,solr:0,specValues:[{id:0,name:藍色,pic:blue.jpg},{id:1,name:紅色,pic:red.jpg}]},{id:1,name:尺碼,solr:1,specValues:[{id:2,name:10},{id:3,name:20}]}] /*for(var i=0;i<productSpecs.length;i++){ productSpecs[i].id; productSpecs[i].name; for(var j=0;j<productSpecs[i].specValues.length;j++){ productSpecs[i].specValues[j].id; productSpecs[i].specValues[j].name; productSpecs[i].specValues[j].pic; } }*/
上面的代碼我只寫了取數據的部分,是由於這個編輯器不方便編碼,其實只要取到了 數據,生成表格就很簡單了,實際開發中這塊應該是在動態頁面中處理完成的,動態頁面通常都有遍歷列表的方式,好比jsp中的jstl等。
表格選項生成了,也梳理通了邏輯,那麼剩下的其實很簡單了,好比用戶選擇顏色:藍色,尺碼:10的一個貨品,顏色藍色id是0,尺碼10id是2,那麼咱們後臺就去貨品表裏查找goodsKeys相匹配的貨品,經過比較咱們發現貨品1是匹配的,由於它的goodsKeys是[{id:0},{id:2}],那麼咱們把貨品1的數據展現到頁面便可。
怎麼樣,思路是否是清晰了,也許個人思路是錯的,可是功能可以實現是最重要的。
若是你有更好的方式,請推薦給我,謝謝。
商品發佈規格組合算法部分可參考這個:商品發佈規格組合算法