2013-01-08 104 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

您能否提供拟议比较表的模式?有很多方法可以做到这一点,到目前为止,在您的概念内工作会更有成效;如果有问题,那么我可以在那个时候提出建议。 –