0

Nous voulons stocker des données de comparaison entre deux ou plusieurs produits sur notre site Web de magasinage.Schéma de base de données de comparaison de produits

Je trouve le lien suivant, mais quand nous essayons que nous avions des problèmes de performance

SQL Group By/Count: Count Same Values Across Multiple Columns?

Comment pouvons-nous stocker nos données? Quel devrait être notre schéma de table pour les données d'historique de comparaison et comment puis-je montrer les produits les plus comparés? Quelle sera la requête?

Répondre

0

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.

+0

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

+0

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à. –

Questions connexes