關(guān)于商城系統(tǒng)中商品類別的設(shè)計(jì)(續(xù)篇)
上一節(jié)《關(guān)于商城系統(tǒng)中商品類別的設(shè)計(jì)》中我說(shuō)數(shù)據(jù)庫(kù)設(shè)計(jì)有一塊硬傷,到底在哪兒?先看下圖:
看上圖中有什么地方是相同的?
“品牌”→“三星”在手機(jī)數(shù)碼分類里面有,在電腦辦公分類里面也有,這有什么問(wèn)題?再來(lái)看看上篇中的那個(gè)關(guān)系圖:
再看數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),首先是(T_FilterCategory表)
如下(T_FilterAttributes表)
如下(T_FilterCategory與T_FilterAttributes之間的關(guān)聯(lián)表)
如上圖,既然“品牌”→“三星”在手機(jī)數(shù)碼分類里面有,在電腦辦公分類里面也有,那么如果只是像上面這個(gè)關(guān)聯(lián)表這么保存篩選條件和篩選條件值,我如何區(qū)分哪個(gè)是手機(jī)數(shù)碼下的“品牌”→“三星”,哪個(gè)是電腦辦公分類下的“品牌”→“三星”?如果我不區(qū)分它,會(huì)發(fā)生什么情況?現(xiàn)在有這么個(gè)業(yè)務(wù),需要我通過(guò)用戶選擇的三級(jí)類別,展示出指定三級(jí)類型下的“篩選條件”和對(duì)應(yīng)的“篩選條件值”,那么我該怎么實(shí)現(xiàn)呢,按照上面的關(guān)系圖,假設(shè)用戶點(diǎn)擊了“手機(jī)數(shù)碼分類”下的“手機(jī)”,它的類別編號(hào)為“14”,那么我可以寫(xiě)出如下SQL語(yǔ)句:
***步,根據(jù)用戶選擇的類別獲取其下的“篩選條件”。
- select fc.fc_Id,fc.fc_Name from T_FilterCategory as fc
- inner join RF_Columns_FilterCategory as cfc on fc.fc_Id = cfc.fc_Id
- inner join T_Columns as col on cfc.col_Id = col.col_Id
- where col.col_Id = '14'
執(zhí)行結(jié)果如下:
現(xiàn)在我再根據(jù)上面的“篩選條件”獲取對(duì)應(yīng)的“篩選屬性值”:
- select fa.attr_Id,fa.attr_Name from T_FilterAttributes as fa
- inner join RF_FilterCategory_TFilterAttributes as fcfa on fa.attr_Id = fcfa.attr_Id
- inner join T_FilterCategory as fc on fcfa.fc_Id = fc.fc_Id
- where fc.fc_Id in
- (select fc.fc_Id from T_FilterCategory as fc
- inner join RF_Columns_FilterCategory as cfc on fc.fc_Id = cfc.fc_Id
- inner join T_Columns as col on cfc.col_Id = col.col_Id
- where col.col_Id = '14')
結(jié)果如下:
看上面紅色方框中的“篩選屬性值”,像宏碁、華碩、戴爾、Gateway、清華同方等,它們是電腦廠商,而不是手機(jī)廠商,然而卻出現(xiàn)在手機(jī)類別下,這不是有問(wèn)題嗎?
所以這種設(shè)計(jì)有問(wèn)題,因?yàn)樗绷艘粡埍?這張表就是存儲(chǔ)關(guān)聯(lián)表RF_FilterCategory_TFilterAttributes與T_Columns表之間的關(guān)系的中間表。為什么要加中間表?因?yàn)橐粋€(gè)三級(jí)類別可以對(duì)應(yīng)多個(gè)RF_FilterCategory_TFilterAttributes,而一個(gè)RF_FilterCategory_TFilterAttributes又可以被多個(gè)三級(jí)類別擁有。圖示見(jiàn):頂部 圖(1)
于是我繼續(xù)加表,名曰:RF_Columns_FilterCategory_FilterAttributes,如下圖:
然后建立外鍵關(guān)聯(lián),如下圖:
然后完整的關(guān)系圖如下:
然后我再次執(zhí)行上面那個(gè)業(yè)務(wù),假設(shè)用戶選擇的三級(jí)類別的編號(hào)為14,我需要獲取其下的所以“篩選條件值“,那么SQL語(yǔ)句如下:
- with t as
- (
- select FA.attr_Id,FA.attr_Name,CDF.col_Id,CDF.sort from T_FilterAttributes as FA
- inner join dbo.RF_FilterCategory_TFilterAttributes as DF on FA.attr_Id = DF.attr_Id
- inner join dbo.RF_Columns_FilterCategory_FilterAttributes as CDF on CDF.df_Id = DF.df_Id and CDF.col_Id = '14'
- )
- select t.attr_Id,t.attr_Name from t
- inner join dbo.RF_FilterCategory_TFilterAttributes as DF on t.attr_Id = DF.attr_Id
- inner join dbo.T_FilterCategory as FC on DF.fc_Id = FC.fc_Id and FC.fc_Id in
- (
- select fc.fc_Id from T_Columns as tc
- inner join dbo.RF_Columns_FilterCategory as cdc on tc.col_Id = cdc.col_Id
- inner join T_FilterCategory as fc on cdc.fc_Id = fc.fc_Id14 where tc.col_Id = '
- '
- )
- 16 order by t.sort
然后就得到如下所有手機(jī)類別下的“篩選條件“對(duì)應(yīng)的”篩選條件值“,如下圖:
原文鏈接:http://www.cnblogs.com/twittersu/archive/2011/06/14/2080868.html
【編輯推薦】