我們希望在我們的購物網站中存儲兩種或更多產品之間的比較數據。產品比較數據庫模式
我發現下面的鏈接,但是當我們嘗試,我們有一些性能問題
SQL Group By/Count: Count Same Values Across Multiple Columns?
我們如何存儲數據?我們的比較歷史數據表格模式應該如何顯示,以及如何顯示最多的比較產品?什麼將是查詢?
我們希望在我們的購物網站中存儲兩種或更多產品之間的比較數據。產品比較數據庫模式
我發現下面的鏈接,但是當我們嘗試,我們有一些性能問題
SQL Group By/Count: Count Same Values Across Multiple Columns?
我們如何存儲數據?我們的比較歷史數據表格模式應該如何顯示,以及如何顯示最多的比較產品?什麼將是查詢?
這個問題很廣泛,有點含糊,我的回答可能包含你已經做過的考慮。
爲了做比較邏輯,你需要三件事情;產品,該產品的評級以及將產品進行邏輯分組以供比較的方法。具有適當索引的粒度通常是最好的。
這裏是表/索引的一個例子,我將創建:把聚集索引上的產品
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,它仍然可以正常工作。不管你想要如何編輯或改變它。
這不是我的意思。必須有一個比較表,客戶的比較可以保存。然後,我們想列出大多數比較產品,或者在我們想要展示的產品信息表格中列出「該產品與其他產品相比最多」。 – ramazanulucay
您能否提供擬議比較表的模式?有很多方法可以做到這一點,到目前爲止,在您的概念內工作會更有成效;如果有問題,那麼我可以在那個時候提出建議。 –