我创建了一个包含产品,产品名称,商店规格的数据库。规范表(product_specs_koppel)的设置如下:
pid | sid | value
1 | 1 | Y
2 | 1 | N
1 | 2 | 30
2 | 2 | 30
其中pid =产品ID,sid =规范ID和值是该规范的值。到目前为止没问题,我存储规范的名称是一个不同的表,可以在sid上链接。
选择退出数据库时出现问题。例如,我想选择所有pid,具有以下条件:
我可以在主查询中创建两个子查询,但这不是一个可扩展的解决方案:
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')
是否有更好的方法来设置数据库或将我的查询更改/更新为更具伸缩性的解决方案?
答案 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解决方案。