2011-06-18 48 views
0

我目前正在重新設計一個重載網站,我希望對特定的數據庫設計問題有任何意見。MySQL數據庫 - 性能設計

這個概念是保留在數據庫中的許多產品(其中500K)。 每個產品都可以擁有許多動態屬性(大約1K),每個屬性都有許多預定義但動態的值(可以說每個屬性的平均值爲10,所以約爲10K)

此時此刻簡化數據庫結構:

產品(產品表)

+--------+--------------+ 
| ProdID | Product Name | 
+--------+--------------+ 
| 1  | T-Shirt XYZ | 
+--------+--------------+ 
| 2  | Dress ABC | 
+--------+--------------+ 
| ... | ...   | 
+--------+--------------+ 
| 500000 | Something | 
+--------+--------------+ 

屬性定義(表道具)(其持有的物業類型)

+--------+--------------+ 
| PropID | Property Name| 
+--------+--------------+ 
| 1  | color  | 
+--------+--------------+ 
| 2  | size   | 
+--------+--------------+ 
| ... | ...   | 
+--------+--------------+ 
| 100 | Some Prop | 
+--------+--------------+ 

屬性值定義(值表)

+-----------+--------+-------+ 
| PropValID | PropID | Value | 
+-----------+--------+-------+ 
|   1 |  1 | red | 
+-----------+--------+-------+ 
|   2 |  1 | blue | 
+-----------+--------+-------+ 
|   3 |  2 | m  | 
+-----------+--------+-------+ 
|   4 |  2 | xl | 
+-----------+--------+-------+ 
|   5 |  2 | xxl | 
+-----------+--------+-------+ 
| ...  | ... | ... | 
+-----------+--------+-------+ 
|  1000 | 100 | xyz | 
+-----------+--------+-------+ 

這樣我們就可以在任何產品中添加任何數量的屬性和值。 下表包含此信息。

產品屬性&值(ProdPropVal表)

+--------+--------+--------+-----------+ 
| InfoID | ProdID | PropID | PropValID | 
+--------+--------+--------+-----------+ 
|  1 |  1 |  1 |   1 | 
+--------+--------+--------+-----------+ 
|  2 |  1 |  2 |   3 | 
+--------+--------+--------+-----------+ 
|  3 |  2 |  1 |   2 | 
+--------+--------+--------+-----------+ 
|  4 |  2 |  2 |   5 | 
+--------+--------+--------+-----------+ 
| ... | ... | ... |   | 
+--------+--------+--------+-----------+ 

在上面的例子中,我們知道,「T恤XYZ」有藍色,其大小爲中等。

而現在棘手的部分... 如果我們想要找到所有產品具有共同的屬性值設置(所有產品的藍色和中等大小)這是最好的方法?

我的想法:

  1. 搜索一次的ProdPropVal表中的每個PropValID並在代碼中的結果進行比較。這可以通過從最罕見的PropValID開始並在接下來的查詢中使用WHERE ProdID IN(先前的ID)限制ProdID來進行調整。

  2. 對於每個需要的PropValID,在ProdPropVal表中使用Inner Join。例如:SELECT ProdID FROM ProdPropVal ppv1 INNER JOIN ProdPropVal ppv2 ON ppv1.ProdID = ppv2.ProdID INNER JOIN ProdPropVal ppv3 ON ppv1.ProdID = ppv3.ProdID INNER JOIN ProdPropVal ppv4 ON ppv1.ProdID = ppv4.ProdID WHERE ppv1.PropValID = 10和ppv2.PropValID = 20,ppv3.PropValID = 30和ppv4.PropValID = 150

這是我的想法而已。 ProdPropVal平板電腦擁有數百萬行的事實不會留下任何錯誤空間。

任何建議是最受歡迎的!

+0

對我來說似乎合乎邏輯。 1)_InfoID_是否必要? 2)對績效最重要的是,這些表格如何編制索引? – Wiseguy

回答

1

要找到藍色的所有產品和中型我這樣做:

SELECT ProdID 
    FROM ProdPropVal 
    WHERE (PropID = 1 AND PropValID = 2) 
    OR (PropID = 2 AND PropValID = 3) 
    GROUP BY ProdID 
    HAVING COUNT(*) = 2 

更妙的是,如果PropValID是在值表中唯一的,那麼你會從ProdPropVal表中刪除PROPID列,並簡化對此的查詢:

SELECT ProdID 
    FROM ProdPropVal 
    WHERE PropValID IN (2, 3) 
    GROUP BY ProdID 
    HAVING COUNT(*) = 2