Схема базы данных сравнения продуктов

Мы хотим хранить сравнительные данные между двумя или более продуктами на нашем веб-сайте для покупок.

Я нашел следующую ссылку, но когда мы попытались это сделать, у нас возникли некоторые проблемы с производительностью.

SQL Group By/Count: подсчет одинаковых значений в нескольких столбцах ?

Как мы можем хранить наши данные? Какой должна быть наша схема таблицы для данных истории сравнения и как я могу показать наиболее сравниваемые продукты? Какой будет запрос?


person ramazanulucay    schedule 08.01.2013    source источник


Ответы (1)


Вопрос довольно широкий и немного расплывчатый, мой ответ может включать соображения, которые вы уже высказали.

Чтобы выполнить логику сравнения, вам нужны три вещи; продукт, рейтинги этого продукта и некоторый метод логической группировки продуктов для сравнения. Детализация с правильными индексами обычно лучше.

Вот пример таблиц/индексов, которые я бы создал:

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
comment
Это не я имел в виду. Должна быть таблица сравнений, чтобы можно было сохранить сравнения клиентов. И затем мы хотим перечислить продукты, которые чаще всего сравнивают, или в форме информации о продукте мы хотим показать, что «этот продукт больше всего сравнивается с другим продуктом». - person ramazanulucay; 10.01.2013
comment
Не могли бы вы предоставить схему предлагаемой таблицы сравнений? Есть много способов сделать это, и до сих пор будет более продуктивно работать в рамках вашей концепции; если есть проблемы с этим, то я могу внести предложения в этот момент. - person Eric J. Price; 10.01.2013