Вопрос довольно широкий и немного расплывчатый, мой ответ может включать соображения, которые вы уже высказали.
Чтобы выполнить логику сравнения, вам нужны три вещи; продукт, рейтинги этого продукта и некоторый метод логической группировки продуктов для сравнения. Детализация с правильными индексами обычно лучше.
Вот пример таблиц/индексов, которые я бы создал:
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)
Размещение кластеризованных индексов в Product, Group и RatingType имеет смысл, поскольку их столбцы идентификаторов будут их столбцами идентификаторов, поэтому вам не нужно беспокоиться о физическом порядке, поскольку они будут последовательными. С другой стороны, 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, он все равно будет работать нормально. Вы можете отредактировать или изменить его, как хотите.
person
Eric J. Price
schedule
08.01.2013