我目前正在重新设计一个负担重的网站,对于任何有关特定数据库设计问题的意见,我将不胜感激。

概念是在数据库中保留许多产品(其中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/

10-10 07:44