Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление 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,  09:30 Найти цитируемый пост)
не является оптимальным

Это издержки той структуры, которую вы выбрали. Цена гибкости. smile 
Данная структура не предназначена для такого рода запросов. Нормального решения нет, только компромиссные.

Автор: EasyTask 24.3.2013, 12:48
Можете привести примеры таких решений? smile

Автор: Zloxa 24.3.2013, 13:00
Зачем? Вы и так знаете правильный ответ.
Цитата(EasyTask @  24.3.2013,  09:30 Найти цитируемый пост)
джойнить таблицу саму на себя


Автор: EasyTask 24.3.2013, 13:08
Я бы назвал такое решение не компромисным, а радикальным )

Автор: Zloxa 24.3.2013, 14:47
EasyTask, после того, как вы договоритесь с собой/заказчиком принять это решение  не смотря на его радикальность, оно станет компроммисным  smile

Добавлено через 14 минут и 46 секунд
Цитата(EasyTask @  24.3.2013,  09:30 Найти цитируемый пост)
Выбрать все продукты, у которых свойство цена > 10 и категория "Стройматериалы"

Можно еще
Код

  were property = цена and value > 10
    or property = категория and value = "Стройматериалы"
  group by product
  having count(*)=2

Но это еще более радикальное решение

Автор: EasyTask 24.3.2013, 15:45
Почему вы считаете это решение таким уж радикальным? smile Мне оно вполне нравится.

Автор: Zloxa 24.3.2013, 16:39
Потому, что это лучше джойна это может быть лишь в частных случаях, когда селективность предикатов слишком велика, чтобы использовать индекс. В случаях, когда индексный доступ по предикатам может быть эффективен, вариант с группировкой против варианта с джойном будет иметь лишнюю сортировку, необходимую для группировки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)