Mysql EAV建模数据库模式-查询建议

Mysql EAV建模数据库模式-查询建议,mysql,database,database-design,schema,entity-attribute-value,Mysql,Database,Database Design,Schema,Entity Attribute Value,我正在构建一个客户的数据库模式&我宁愿使用EAV(entity-attribute-value)Magento风格,将这些数据存储在其他表中并链接起来,而不是一直在添加列 我的SQL FIDLE可以更好地了解结构 在本例中,我希望生成一个查询,显示所有客户及其存储在其他表中的相关信息,例如,如果某个客户没有特定实体的值,它只显示NULL e、 g我希望显示的输出如下: customer_id | first_name | surname | profession | club

我正在构建一个客户的数据库模式&我宁愿使用EAV(entity-attribute-value)Magento风格,将这些数据存储在其他表中并链接起来,而不是一直在添加列

我的SQL FIDLE可以更好地了解结构

在本例中,我希望生成一个查询,显示所有客户及其存储在其他表中的相关信息,例如,如果某个客户没有特定实体的值,它只显示NULL

e、 g我希望显示的输出如下:

customer_id | first_name |  surname  | profession | club
      1          bob        geldof       singer      NULL
      2         lionel       messi      footballer   barcelona fc

有谁能推荐最优化的MySQL查询来生成此记录集,因为以后可能会添加更多的实体或属性?

这种类型的SQL查询将生成您要查找的表,但您必须根据“eav_属性”表的内容动态生成此查询

正如KM所说,每个属性都需要另一个左连接

SELECT
  customer_entity.customer_id AS customer_id,
  name.value AS firstname, 
  surname.value AS surname,
  profession.value AS profession,
  club.value AS club
FROM customer_entity
  LEFT JOIN customer_varchar AS name
    ON name.entity_id = customer_entity.customer_id AND name.attribute_id = 1
  LEFT JOIN customer_varchar AS surname
    ON surname.entity_id = customer_entity.customer_id AND surname.attribute_id = 2
  LEFT JOIN customer_varchar AS profession
    ON profession.entity_id = customer_entity.customer_id AND profession.attribute_id = 3
  LEFT JOIN customer_varchar AS club
    ON club.entity_id = customer_entity.customer_id AND club.attribute_id = 4
;

很抱歉,要生成此记录集,最优化的MySQL查询将要求您不要使用EAV。通过使用EAV,您的每个结果集属性列都需要一个
左联接
。@KM我同意,我刚刚进入EAV,即使脚趾在途中被烧坏了,我也希望“站稳脚跟”:)您不必为每条记录都左联接,但这可能是性能方面的最佳解决方案。做得好,提供了一个小提琴BTWAm我走错了方向-你会推荐一个不同的策略,而不使用EAV吗?如果可以的话,虽然我确实看到了EAV的问题(难怪Magento有时会这么慢lol),但我现在正在努力想另一种方法。EAV不受欢迎,因为正如你所发现的,它是出了名的难以使用。但是,只要您将其设置为充分利用数据类型,它就很难管理。我是说,看看wordpress。