我创建了一个包含产品规范、产品名称、商店的数据库。规范表(product_specs_koppel)的设置如下:
pid | sid | value
1 | 1 | Y
2 | 1 | N
1 | 2 | 30
2 | 2 | 30
其中 pid = 产品 ID,sid = 规范 ID,value 是该规范的值。到目前为止没有问题,我存储规范的名称是一个不同的表,可以在 sid 上链接。
问题来自于数据库的选择。举个例子,我想选择所有 pid,条件如下:
- sid 1 -> Y
- 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')
如果有更好的方法来设置数据库或将我的查询更改/更新为更具可扩展性的解决方案,有什么建议吗?
最佳答案
您创建的设计通常称为“实体/属性/值”或 EAV。你的产品是实体,属性是规范,“值”列确实是值。
这种设计有优点也有缺点 - 在 Stack Overflow 上经常讨论 - 并且您已经发现了其中一个很大的缺点:在多个属性上构建查询确实很困难。您创建的设计中的另一个问题是您的“值”列不一定能很好地进行数字比较 - 想象一下您如何在 25 到 40 之间调整值。
据我所知,现在标准 EAV 模型可以解决这个问题。
大多数人使用 EAV 是因为他们拥有异构的、不可预测的数据模式。这种数据本质上很难容纳在关系模型中。
您可能需要考虑以文档为中心的解决方案(例如 XML)或 NoSQL 解决方案。
关于php - 改进比较网站的表结构设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20936468/