2013-01-08 137 views

回答

0

這個問題很廣泛,有點含糊,我的回答可能包含你已經做過的考慮。

爲了做比較邏輯,你需要三件事情;產品,該產品的評級以及將產品進行邏輯分組以供比較的方法。具有適當索引的粒度通常是最好的。

這裏是表/索引的一個例子,我將創建:把聚集索引上的產品

Create Table Product (ProductID Int, ProductName Varchar(256), etc) 
Create Table Groups (GroupID Int, GroupName Varchar(256), etc) 
Create Table ProductGroup (ProductID Int, GroupID Int) 
Create Table RatingType (RatingID Int, RatingName Varchar(64)) 
Create Table ProductRatings (ProductID Int, RatingID Int, RatingValue Varchar(32)) 

Create Clustered Index ix_Product_pID On Product (ProductID) 
Create Nonclustered Index ix_Product_pID_pName On Product (ProductID, ProductName) 
Create Clustered Index ix_Groups_gID On Groups (GroupID) 
Create Nonclustered Index ix_ProductGroup_gID_pID On ProductGroup (GroupID, ProductID) 
Create Clustered Index ix_RatingType_rID On RatingType (RatingID) 
Create Nonclustered Index ix_ProductRatings_pID_rID On ProductRatings (ProductID, RatingID) 

,集團和RATINGTYPE也解釋了他們的ID列將自己的身份列,所以你不必擔心物理順序,因爲它們將是順序的。另一方面,ProductGroup和ProductRatings可以隨時以任何順序接收任何記錄,因此在其上放置聚簇索引會降低插入速度並導致更快的碎片化。

要進行查詢所做的邏輯鏈接的例子,你會做這樣的事情:

Create Proc GetProductComparisonRatings (@productID Int, @ratingID Int) 
As 

Declare @columns Nvarchar(Max), 
     @SQL Nvarchar(Max); 

;With DistinctCols As 
(
     Select Distinct p.productName 
     From ProductGroup pg1 
     Join ProductGroup pg2 
       On pg1.groupID = pg2.groupID 
     Join Product p 
       On pg2.productID = p.productID 
     Where pg1.productID = @productID  
) 
Select @columns = Coalesce(@columns + ',','') + '[' + productName + ']' 
From DistinctCols 
Order By Case 
      When p.productID = @productID Then 0 
      Else 1 
      End;  -- This will put your product that was the basis of the comparison as the leftmost column 

Select @SQL = ';With baseRecords As 
       (
         Select pg2.productID, 
           pr.ratingValue, 
           Count(1) As cnt 
         From ProductGroup pg1 
         Join ProductGroup pg2 
           On pg1.groupID = pg2.groupID 
         Join ProductRatings pr 
           On pg2.productID = pr.productID 
           And pr.ratingID = ' + @ratingID + ' 
         Where pg1.productID = ' + @productID + ' 
         Group By pg2.productID, 
            pr.ratingValue; 
       ) 
       Select ratingValue, ' + @columns + ' 
       From baseRecords br 
       Join product p 
         On br.productID = p.productID 
       Pivot (Sum(cnt) For p.productName In (' + @columns + ')) pivot'; 

Exec sp_executeSQL @SQL; 

這需要它一步更遠,限制了收視率比較特定RATINGTYPE;一些例子可能是(耐用性,尺寸,總體)。如果您只有一個ratingType,它仍然可以正常工作。不管你想要如何編輯或改變它。

+0

這不是我的意思。必須有一個比較表,客戶的比較可以保存。然後,我們想列出大多數比較產品,或者在我們想要展示的產品信息表格中列出「該產品與其他產品相比最多」。 – ramazanulucay

+0

您能否提供擬議比較表的模式?有很多方法可以做到這一點,到目前爲止,在您的概念內工作會更有成效;如果有問題,那麼我可以在那個時候提出建議。 –