關於商商城商品表設計(二)

上一節《關於商城系統中商品表的設計》中我說數據庫設計有一塊硬傷,到底在哪兒?今天我們來進行分析。

看下圖:

 

 

看上圖中有什麼地方是相同的?

“品牌”→“三星”在手機數碼分類裏面有,在電腦辦公分類裏面也有,這有什麼問題?再來看看上篇中的那個關係圖:

 

再看數據庫中存儲的數據,首先是(T_FilterCategory表)

 

如下(T_FilterAttributes表)

 

如下(T_FilterCategory與T_FilterAttributes之間的關聯表)

 

如上圖,既然“品牌”→“三星”在手機數碼分類裏面有,在電腦辦公分類裏面也有,那麼如果只是像上面這個關聯表這麼保存篩選條件和篩選條件值,我如何區分哪個是手機數碼下的“品牌”→“三星”,哪個是電腦辦公分類下的“品牌”→“三星”?如果我不區分它,會發生什麼情況?現在有這麼個業務,需要我通過用戶選擇的三級類別,展示出指定三級類型下的“篩選條件”和對應的“篩選條件值”,那麼我該怎麼實現呢,按照上面的關係圖,假設用戶點擊了“手機數碼分類”下的“手機”,它的類別編號爲“14”,那麼我可以寫出如下SQL語句:

第一步,根據用戶選擇的類別獲取其下的“篩選條件”。

  1. select fc.fc_Id,fc.fc_Name from T_FilterCategory as fc  
  2. inner join RF_Columns_FilterCategory as cfc on fc.fc_Id = cfc.fc_Id  
  3. inner join T_Columns as col on cfc.col_Id = col.col_Id  
  4. where col.col_Id = '14' 

執行結果如下:

現在我再根據上面的“篩選條件”獲取對應的“篩選屬性值”:

  1. select fa.attr_Id,fa.attr_Name from T_FilterAttributes as fa  
  2. inner join RF_FilterCategory_TFilterAttributes as fcfa on fa.attr_Id = fcfa.attr_Id  
  3. inner join T_FilterCategory as fc on fcfa.fc_Id = fc.fc_Id  
  4. where fc.fc_Id in 
  5. (select fc.fc_Id from T_FilterCategory as fc  
  6. inner join RF_Columns_FilterCategory as cfc on fc.fc_Id = cfc.fc_Id  
  7. inner join T_Columns as col on cfc.col_Id = col.col_Id  
  8. where col.col_Id = '14'

結果如下:

看上面紅色方框中的“篩選屬性值”,像宏碁、華碩、戴爾、Gateway、清華同方等,它們是電腦廠商,而不是手機廠商,然而卻出現在手機類別下,這不是有問題嗎?

所以這種設計有問題,因爲它缺了一張表!這張表就是存儲關聯表RF_FilterCategory_TFilterAttributes與T_Columns表之間的關係的中間表。爲什麼要加中間表?因爲一個三級類別可以對應多個RF_FilterCategory_TFilterAttributes,而一個RF_FilterCategory_TFilterAttributes又可以被多個三級類別擁有。圖示見:頂部 圖(1)

於是我繼續加表,名曰:RF_Columns_FilterCategory_FilterAttributes,如下圖:

 

然後建立外鍵關聯,如下圖:

 

然後完整的關係圖如下:

 

然後我再次執行上面那個業務,假設用戶選擇的三級類別的編號爲14,我需要獲取其下的所以“篩選條件值“,那麼SQL語句如下:

  1. with t as   
  2. (   
  3. select FA.attr_Id,FA.attr_Name,CDF.col_Id,CDF.sort from T_FilterAttributes as FA   
  4. inner join dbo.RF_FilterCategory_TFilterAttributes as DF on FA.attr_Id = DF.attr_Id   
  5. inner join dbo.RF_Columns_FilterCategory_FilterAttributes as CDF on CDF.df_Id = DF.df_Id and CDF.col_Id = '14'   
  6. )   
  7. select t.attr_Id,t.attr_Name from t   
  8. inner join dbo.RF_FilterCategory_TFilterAttributes as DF on t.attr_Id = DF.attr_Id   
  9. inner join dbo.T_FilterCategory as FC on DF.fc_Id = FC.fc_Id and FC.fc_Id in   
  10. (  
  11.  select fc.fc_Id from T_Columns as tc  
  12.  inner join dbo.RF_Columns_FilterCategory as cdc on tc.col_Id = cdc.col_Id   
  13.  inner join T_FilterCategory as fc on cdc.fc_Id = fc.fc_Id14 where tc.col_Id = '  
  14. '  
  15. )  
  16.  
  17. 16 order by t.sort 

然後就得到如下所有手機類別下的“篩選條件“對應的”篩選條件值“,如下圖:

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章