【发布时间】:2014-06-17 23:37:17
【问题描述】:
我正在构建客户的数据库架构,而不是随着时间的推移永远添加列,我更喜欢使用 EAV(实体属性值)Magento 风格,将这些数据存储在其他表中并链接起来。
我的 SQL Fiddle 可以更好地了解结构 http://sqlfiddle.com/#!2/82a70
在这种情况下,我想生成一个查询,显示所有客户及其存储在其他表中的相关信息,例如,如果客户没有获得特定实体的值,它只会显示 NULL。
例如,我想要显示的输出如下:
customer_id | first_name | surname | profession | club
1 bob geldof singer NULL
2 lionel messi footballer barcelona fc
在以后可能添加更多实体或属性的基础上,谁能建议最优化的 MySQL 查询来生成此记录集?
【问题讨论】:
-
抱歉,
the most optimised MySQL query to produce this recordset要求您不要使用 EAV。通过使用 EAV,您的每个结果集属性列都需要一个left join。 -
@KM 我同意,我刚刚进入 EAV,即使脚趾在途中被烧伤,我也想“站稳脚跟”:)
-
您不必为每条记录都进行 LEFT JOIN - 但这可能是性能方面的最佳解决方案。顺便说一句,提供小提琴做得很好
-
我是不是走错路了——你会推荐一个不同的策略而不使用 EAV 吗?如果可以的话,尽管我确实看到了 EAV 的问题(难怪 Magento 有时会如此缓慢,哈哈),但我目前正在努力想另一种方法。
-
EAV 不受欢迎,因为正如您所发现的,众所周知,它很难使用。但是,只要您将其设置为充分利用数据类型,它就可以轻松管理。我的意思是,看看 wordpress。
标签: mysql database database-design schema entity-attribute-value