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

标签 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,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/

相关文章:

php - 如何将页面url存储到mysql数据库

php - 为什么 PHP MySql 连接不起作用?

mysql - 在mysql中使用多个连接时加快查询速度

sql - 您登录旁边的数字是什么意思

c# - 在存储过程调用中使用默认参数

php - PHP 文件中嵌入 SQL 的 Notepad++ 语法高亮

php - HTML/CSS - 移动设备在开始时缩放

php - 如何建立链接 2 个以上模型的 'has-many-through' 关系?

javascript - 如何隐藏每条记录的按钮

MySQL:如何从 .SQL 脚本文件运行 shell 命令