Я реализовал модель EAV с использованием MySQL (phpmyadmin) для веб-сайта электронной коммерции, разработанного с использованием CodeIgniter Framework (PHP). Модель EAV работает следующим образом:
Таблица : Продукты
id | name | description
-------------------------
1 | prod_1 | lorem
2 | prod_2 | ipsum
Таблица : Атрибуты
id | name | description
-------------------------
1 | attr_1 | dolor
2 | attr_2 | sit
3 | attr_3 | amet
Таблица : Атрибуты_продукта
id | prod_id | attr_id
-------------------------
1 | 1 | 1
2 | 1 | 2
3 | 2 | 1
4 | 2 | 2
5 | 2 | 3
Я сгенерировал результат с использованием нескольких объединений, который выглядит следующим образом:
product_name | attribute_name | product_description
---------------------------------------------------
prod_1 | attr_1 | lorem
prod_1 | attr_2 | lorem
prod_2 | attr_1 | ipsum
prod_2 | attr_2 | ipsum
prod_2 | attr_3 | ipsum
Запрос, использованный для приведенного выше результата, выглядит следующим образом:
function getProductList() {
return $this->db->select('p.name as product_name, a.name as attribute_name, p.description as product_description')
->from('products as p')
->join('product_attributes as pa', 'pa.prod_id = p.id', 'LEFT')
->join('attributes as a', 'a.id = pa.attr_id', 'LEFT')
->get();
}
Но в результате запроса я хочу получить следующее:
product_name | attribute_name | product_description
-------------------------------------------------------------
prod_1 | (attr_1, attr_2) | lorem
prod_2 | (attr_1, attr_2, attr_3) | ipsum
Недостаток текущего результата запроса заключается в том, что мне нужно выполнить вложенный цикл для отображения списка продуктов и их атрибутов, что влияет на производительность. Я открыт для любых предложений по улучшению производительности запроса или его результата.
- EDIT -
У меня также есть другие связанные таблицыс таблицей Products
. Скажем, например, есть дополнительная таблица следующим образом:
Таблица : Размеры
id | name | value
-----------------
1 | length | 20
2 | breadth| 15
3 | height | 20
Таблица : Product_Dimensions
id | prod_id | dim_id
-------------------------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 2 | 1
5 | 2 | 2
Таким образом, ожидаемый результат изменяется следующим образом:
product_name | attribute_name | product_description| dimension_name | dimension_value
----------------------------------------------------------------------------------------------------------
prod_1 | (attr_1, attr_2) | lorem | (length, breadth, height) | (20, 15, 20)*
prod_2 | (attr_1, attr_2, attr_3) | ipsum | (length, breadth) | (20, 15)
Но полученный результат выглядит следующим образом:
product_name | attribute_name | product_description| dimension_name | dimension_value
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
prod_1 | (attr_1, attr_2, attr_1, attr_2, attr_1, attr_2) | lorem | (length, breadth, height, length, breadth, height) | (20, 15, 20, 20, 15, 20)
prod_2 | (attr_1, attr_2, attr_3, attr_1, attr_2, attr_3) | ipsum | (length, breadth, length, breadth, length, breadth) | (20, 15, 20, 15, 20, 15)
- EDIT -
При использовании DISTINCT
в GROUP_BY
выход изменяется следующим образом:
product_name | attribute_name | product_description| dimension_name | dimension_value
----------------------------------------------------------------------------------------------------------
prod_1 | (attr_1, attr_2) | lorem | (length, breadth, height) | (20, 15)*
prod_2 | (attr_1, attr_2, attr_3) | ipsum | (length, breadth) | (20, 15)
* Youможно увидеть разницу между ожидаемым и полученным результатом. Предполагаемые дубликаты также удаляются с помощью DISTINCT
.
SQL Fiddle , чтобы попробовать свои силы на здесь .