我目前正在重新设计一个负担重的网站,对于任何有关特定数据库设计问题的意见,我将不胜感激。
概念是在数据库中保留许多产品(其中500K)。
每个产品可以具有多个动态属性(大约1K),每个属性可以具有多个预定义但动态的值(每个属性平均可以说10个,所以大约1万个)
此时,这是简化的数据库结构:
产品(产品表)
+--------+--------------+
| 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来进行微调。
在ProdPropVal表中为每个所需的PropValID使用内部联接。类似于以下内容:从ProdPropVal ppv1内连接中选择ProdID ProdPropVal ppv2上ppv1.ProdID = ppv2.ProdID内连接ProdPropVal ppv3上ppv1.ProdID = ppv3.ProdID内连接ppv1 ppv4 ON.ProdIDpv1。 AND ppv2.PropValID = 20 AND ppv3.PropValID = 30 AND ppv4.PropValID = 150
到目前为止,这是我的想法。 ProdPropVal数位板具有数百万行的事实并没有留下错误的余地。
任何建议都是最欢迎的!
最佳答案
要找到所有蓝色和中等尺寸的产品,我可以这样做:
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
关于mysql - MySQL数据库-性能设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6399181/