我目前正在重新設計一個重載網站,我希望對特定的數據庫設計問題有任何意見。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」有藍色,其大小爲中等。
而現在棘手的部分... 如果我們想要找到所有產品具有共同的屬性值設置(所有產品的藍色和中等大小)這是最好的方法?
我的想法:
搜索一次的ProdPropVal表中的每個PropValID並在代碼中的結果進行比較。這可以通過從最罕見的PropValID開始並在接下來的查詢中使用WHERE ProdID IN(先前的ID)限制ProdID來進行調整。
對於每個需要的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平板電腦擁有數百萬行的事實不會留下任何錯誤空間。
任何建議是最受歡迎的!
對我來說似乎合乎邏輯。 1)_InfoID_是否必要? 2)對績效最重要的是,這些表格如何編制索引? – Wiseguy