Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Составление SQL-запросов > Фильтрация по атрибутам записи. |
Автор: EasyTask 24.3.2013, 08:30 |
Добрый день! Помогите составить оптимальный алгоритм для следующей ситуации. Таблицы: products - Хранит только идентификаторы продуктов products_property - Хранит пары Идентификатор свойства/Значение свойства с сылкой на продукт products_property_type - Хранит иденификаторы свойств Задача: Составить запрос, который бы делал выборку по нескольким свойствам. Пример: Выбрать все продукты, у которых свойство цена > 10 и категория "Стройматериалы" Выбрать все продукты, у которых есть свойство изображение, свойство "В наличии" равно 1, свойство название равно "Краска" Свойств очень много, поэтому вариант джойнить таблицу саму на себя не является оптимальным. Пожалуйста, подскажете решение. Заранее спасибо. |
Автор: EasyTask 24.3.2013, 11:44 |
Все свойства продукта, в том числе категория, хранятся в products_property Пример одного продукта: products id = 25 cdate = 25.03.2013 products_property product = 25 property = 12 value = 'Стройматериалы' - product = 25 property = 13 value = '1500' - product = 25 property = 14 value = 'Белый' |
Автор: Zloxa 24.3.2013, 12:42 |
Это издержки той структуры, которую вы выбрали. Цена гибкости. ![]() Данная структура не предназначена для такого рода запросов. Нормального решения нет, только компромиссные. |
Автор: EasyTask 24.3.2013, 12:48 |
Можете привести примеры таких решений? ![]() |
Автор: Zloxa 24.3.2013, 13:00 |
Зачем? Вы и так знаете правильный ответ. |
Автор: EasyTask 24.3.2013, 13:08 |
Я бы назвал такое решение не компромисным, а радикальным ) |
Автор: EasyTask 24.3.2013, 15:45 |
Почему вы считаете это решение таким уж радикальным? ![]() |
Автор: Zloxa 24.3.2013, 16:39 |
Потому, что это лучше джойна это может быть лишь в частных случаях, когда селективность предикатов слишком велика, чтобы использовать индекс. В случаях, когда индексный доступ по предикатам может быть эффективен, вариант с группировкой против варианта с джойном будет иметь лишнюю сортировку, необходимую для группировки. |