[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация при организации фильтра по товарам
Страницы: 1, 2
barkar@mail.ru
Цитата (kaww @ 3.06.2014 - 14:18)
Цитата (barkar@mail.ru @ 3.06.2014 - 09:36)
Прошу прощения с этой моделью я не знаком (EAV).
, Entity-Attribute-Value Data Model в гугле много информации можно найти.

Судя по всему вы храните атрибуты как поля в таблице товаров. В этом случае, действительно, посчитать сколько товаров останется при добавлении фильтра достаточно проблематично. Как вариант можно построить таблицу вида [product_id, attribute_name, value], в которой продублировать значения атрибутов (которые используются в фильтрах) товаров из таблицы продуктов:
|------------------------------------|
|product_id | attribute_name | value |
|------------------------------------|
|1 |color |red |
|------------------------------------|
|2 |color |black |
|------------------------------------|
|3 |brand |nokia |
|------------------------------------|

Тогда можно воспользоваться запросом из моего предыдущего поста

Просмотрел данную модель довольно интересно но функционал уже мной написан полностью, а эта модель заставит поменять переписать очень много строк кода, да и наглядность таких таблиц осложнит визуальное понимание и восприятие таблиц.
Спасибо за совет, пока им не воспользуюсь но в дальнейшем изучу более детально и буду пользоваться.

barkar@mail.ru
Код выложил у кого есть советы по оптимизации!
kaww
barkar@mail.ru, если использовать для работы фильтров отдельную таблицу (пост выше), то не нужно отказываться от существующей организации хранения данных. Нужно лишь обеспечить синхронизацию таблицы товаров и таблицы индексов. Кстати, в этом случае уместно будет полю value установить тип integer, и конвертировать строковые значения атрибутов при помощи функции crc32, реализация которой есть как в php так и в mysql. Это еще позволит ощутимо ускорить работу фильтров. Правда, стоит иметь ввиду, что могут возникать коллизии crc32 хэшей (чем в данной задаче, в принципе, можно пренебречь).
barkar@mail.ru
kaww, в таблице filter хранятся все существующие наименования фильтров при выборе фильтра в url идет череда цифр (/odezhda/kurtki/6-39-15) это filter_id, как организовать синхронизацию таблиц я знаю но если их у меня odezhda, obuvj, snarazhenie, zimniy-sport, как их все синхронизировать с filter.
Я вижу ваш стаж уже на этом форуме 4,5 года, возможно я вас недопонимаю в силу своих знаний у меня стаж 1 год и я не программист.
kaww
У вас товары хранятся в разных таблицах? Это не самое лучшее решение.
Ну что же, будем исходить из того что имеем )

Предположим, что вы распарсили строку запроса (ну или сделали что-то подобное) и получили данные для фильтра:
(Код не оптимален, и не пригоден к использовании в том виде в котором представлен)

$filter = array(
'table' => 'odezhda',
'type' => 'kurtki',
'size' => 46,
'color' => 'black'
)

Тогда, получить все товары, которые соответствуют фильтру:

$table = $filter['table'];
unset($filter['table']);
$conditionArr = array();
foreach($filter as $k=>$v) {
$conditionArr[] = 'attribute_name=\'' $k . '\' and `value`=' . ((string)(int)$v === (string)$v ? $v :crc32($v)); // если значение уже в crc32, то условие не нужно
}
$sth = $pdo->query('select id, count(*) as count from product_attribute_value
where table=
\'' . $table . '\' and ((' . implode(') or (', $conditionArr) . ')) group by id having `count` =' . count($filter));
$productIds = array_map(function($row) {return $row['id'];}, $sth->fetchAll());
//$productIds - содержит ид продуктов, которые удовлетворяют фильтру, получить товары select * from $table where product_id in ($productIds)

Далее. Задача определить сколько товаров останется при выборе какого-нибудь фильтра еще (показать в скобках рядом со ссылкой по этому фильтру)
Поскольку, как выяснилось только что, товары хранятся в нескольких таблицах, таблица индекса (product_attribute_value) будет иметь следующую структуру (что так же можно заметить и в предыдущем запросе)):

product_id - ид. товара.
table_name - таблица товара
attribute_name - название атрибута (имя колонки из таблицы товаров. color, size etc.)
value - crc32-хэш значения атрибута товара


$sth = $pdo->query('select `attribute`, `value`, count(*) as `count` from product_attribute_value where
product_id in ('
, implode($productIds) . ') and attribute_name not in (\'' . implode('\',\'', array_keys($filter)) . '\') and `table`=\'' . $table . '\' group by `value`');
$filtersCount;//Заносим результат выборки по запросу. $filtersCount содержит информацию о имени атрибута, значении и количестве результатов если добавить фильтр по этому атрибуту. со значением value (crc32)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.