La question est assez large et un peu vague, ma réponse peut inclure des considérations que vous avez déjà faites. Pour faire la logique de comparaison, vous avez besoin de trois choses; le produit, les évaluations de ce produit et une méthode pour grouper logiquement les produits à des fins de comparaison. La granularité avec des index appropriés est généralement meilleure.
Voici un exemple des tables/index je créerais:
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)
Mise index cluster sur groupe de produits et RatingType de sens que leurs colonnes d'identité seront leurs colonnes d'identité de sorte que vous n'avez pas s'inquiéter de la commande physique puisqu'ils seront séquentiels. En revanche, ProductGroup et ProductRatings peuvent recevoir n'importe quel enregistrement dans n'importe quel ordre, de sorte que la mise en cluster d'index ralentirait les insertions et provoquerait une fragmentation plus rapide.
Pour exécuter la logique fait dans la requête dans l'exemple lié que vous feriez quelque chose comme ceci:
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;
Cela prend un peu plus loin et limite la comparaison des cotes à un ratingType spécifique; quelques exemples pourraient être (durabilité, taille, global). Si vous n'avez qu'un ratingType, il fonctionnera toujours correctement. Vous pouvez le modifier ou le modifier comme vous le souhaitez.
Ce n'est pas ce que je voulais dire. Il doit y avoir une table de comparaisons pour que les comparaisons du client puissent être sauvegardées. Et puis nous voulons lister les produits les plus comparés ou dans un formulaire d'information produit que nous voulons montrer 'ce produit est le plus comparé avec un autre produit'. – ramazanulucay
Pouvez-vous s'il vous plaît fournir le schéma du tableau de comparaison proposé? Il y a plusieurs façons de le faire et il sera plus productif de travailler dans votre conception jusqu'à maintenant; S'il y a des problèmes, je peux faire des suggestions à ce moment-là. –