Архитектура БД для поиска по параметрам - MySQL
Формулировка задачи:
Доброго дня.
Есть задача - добавить на сайт возможность поиска по параметрам. Вкратце:
- у каждого товара может быть свой набор параметров. Скажем, для монитора - диагональ, для ПК - процессор, для моноблока - диагональ и процессор.
- в каждой категории нужно показывать фильтры по заранее заданным параметрам
- у параметра может быть несколько значений, скажем для мониторов порты могут быть VGA, DVI, HDMI и т.д., разумеется поиск должен идти по каждому в отдельности.
Пока что пришёл к такой архитектуре:
Собственно, вопрос - оптимальна ли данная архитектура или есть какие-то более правильные/удобные решения?
Для себя пока что вижу одну проблему - не совсем понятно, как одним запросом вытянуть товар по нескольким параметрам.
Т.е. если юзер захочет найти товары с параметрами 10, 20, 30, то мне нужно будет найти такие id_product, для которых в таблице options_values2products существует 3 записи. Понятно, что можно сначала 1-ый запрос сделать, потом 2-ой, затем 3-ий... но как-то это не комильфо.
options
- параметрыid_option | name
options_values
- возможные значения параметров (третий столбец для удобного визуального редактирования)id_value | name | id_option
options2categories
- какие параметры отображать в категорииid_category | id_option
options_values2products
- привязка значения к товаруid_product, id_value
Решение задачи: «Архитектура БД для поиска по параметрам»
textual
Листинг программы
SELECT id_product FROM `products_cache` WHERE price BETWEEN '$old_price' AND '$new_price' AND id_brand = '$id_brand' AND `options` LIKE '%/$option1/%' AND `options` LIKE '%/$option2/%'
Объяснение кода листинга программы
- В этом коде происходит выборка из таблицы
products_cache
- Выбирается столбец
id_product
- Условие
WHERE
применяется для фильтрации результатов - Фильтр по цене:
price
должен быть между$old_price
и$new_price
(включая их) - Фильтр по бренду:
id_brand
должен быть равен$id_brand
- Фильтр по опциям:
options
должен содержать$option1
(как подстроку) - Фильтр по опциям:
options
должен содержать$option2
(как подстроку) - Значения переменных:
$old_price
,$new_price
,$id_brand
,$option1
,$option2
должны быть определены до выполнения этого запроса. - Этот запрос возвращает
id_product
для продуктов, которые соответствуют всем условиям. - Этот запрос может быть использован для поиска продуктов с заданными опциями и ценовым диапазоном, и он может быть оптимизирован с помощью индексов на столбцах
price
,id_brand
иoptions
. - Запрос не включает любые другие столбцы, кроме
id_product
, поэтому он будет быстрым и эффективным. - Если любое из условий
WHERE
не будет выполнено, то соответствующий продукт не будет возвращен в результате. - Если значения переменных
$old_price
,$new_price
,$id_brand
,$option1
,$option2
не определены, то этот запрос не будет работать. - Этот запрос может быть выполнен с помощью любого SQL-клиента, который поддерживает выполнение SQL-запросов.
- Этот запрос может быть запущен из любого языка программирования, который может выполнять SQL-запросы.
- Этот запрос может быть адаптирован для работы с другими таблицами и другими столбцами, но он должен быть точно настроен для правильной работы.
- Этот запрос может быть использован в более крупном SQL-запросе или в более крупной программе.
- Этот запрос может быть оптимизирован с помощью индексов на столбцах
price
,id_brand
иoptions
, чтобы ускорить его выполнение. - Этот запрос может быть использован для поиска продуктов с определенными опциями и ценовым диапазоном.
- Этот запрос может быть изменен или адаптирован для работы с другими данными или требованиями.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д