改进比较网站的表结构设置

时间:2014-01-05 17:07:26

标签: php mysql sql database

我创建了一个包含产品,产品名称,商店规格的数据库。规范表(product_specs_koppel)的设置如下:

pid | sid | value
1   | 1   | Y
2   | 1   | N
1   | 2   | 30
2   | 2   | 30

其中pid =产品ID,sid =规范ID和值是该规范的值。到目前为止没问题,我存储规范的名称是一个不同的表,可以在sid上链接。

选择退出数据库时出现问题。例如,我想选择所有pid,具有以下条件:

  • sid 1 - > ÿ
  • sid 2 - > 30

我可以在主查询中创建两个子查询,但这不是一个可扩展的解决方案:

SELECT 
    p.naam, k.pid, waarde
FROM 
    product_producten p
INNER JOIN product_specs_koppel k ON (k.pid = p.id)
WHERE 
    k.pid IN
        (Select k1.pid from product_specs_koppel k1 where k1.sid = '1' AND
k1.waarde = 'Y') AND
k.pid IN
    (select k2.pid from product_specs_koppel k2 where k2.sid = '2' AND
 k2.waarde = '30')

是否有更好的方法来设置数据库或将我的查询更改/更新为更具伸缩性的解决方案?

2 个答案:

答案 0 :(得分:1)

如果您的规格不断变化和增长,此模型就可以了。 你不需要内部选择:

SELECT p.naam, p.id, waarde
FROM product_producten p
INNER JOIN product_specs_koppel k1 
   ON k1.pid = p.id AND k1.sid = 1 and k1.value = 'Y'
INNER JOIN product_specs_koppel k2 
   ON k2.pid = p.id AND k2.sid = 2 and k2.value = '30'

这也可能有用: Best beginner resources for understanding the EAV database model?

答案 1 :(得分:1)

您创建的设计通常称为“实体/属性/值”或EAV。您的产品是实体,属性是规范,“值”列确实是值。

这种设计有其优点和缺点 - 经常在Stack Overflow上讨论 - 你发现了一个很大的缺点:在多个属性上构建查询真的很难。你创造的设计中的另一个是你的“价值”专栏不一定与数字比较很好地相配 - 想象你如何在25到40之间精确估价。

据我所知,现在有了标准的EAV模型。

大多数人使用EAV是因为他们拥有异构,不可预测的数据模式。这种数据本身很难适应关系模型。

您可能希望查看以文档为中心的解决方案(例如XML)或NoSQL解决方案。