【问题标题】:EAV modelled database schema - query adviceEAV 建模数据库模式 - 查询建议
【发布时间】: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


【解决方案1】:

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

正如 KM 所说,每个属性都需要另一个 LEFT JOIN

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
;

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2011-11-28
    • 2013-09-11
    相关资源
    最近更新 更多