Архитектура БД для поиска по параметрам - MySQL

Узнай цену своей работы

Формулировка задачи:

Доброго дня. Есть задача - добавить на сайт возможность поиска по параметрам. Вкратце: - у каждого товара может быть свой набор параметров. Скажем, для монитора - диагональ, для ПК - процессор, для моноблока - диагональ и процессор. - в каждой категории нужно показывать фильтры по заранее заданным параметрам - у параметра может быть несколько значений, скажем для мониторов порты могут быть VGA, DVI, HDMI и т.д., разумеется поиск должен идти по каждому в отдельности. Пока что пришёл к такой архитектуре:

options

- параметры
id_option | name

options_values

- возможные значения параметров (третий столбец для удобного визуального редактирования)
id_value | name | id_option

options2categories

- какие параметры отображать в категории
id_category | id_option

options_values2products

- привязка значения к товару
id_product, id_value
Собственно, вопрос - оптимальна ли данная архитектура или есть какие-то более правильные/удобные решения? Для себя пока что вижу одну проблему - не совсем понятно, как одним запросом вытянуть товар по нескольким параметрам. Т.е. если юзер захочет найти товары с параметрами 10, 20, 30, то мне нужно будет найти такие id_product, для которых в таблице options_values2products существует 3 записи. Понятно, что можно сначала 1-ый запрос сделать, потом 2-ой, затем 3-ий... но как-то это не комильфо.

Решение задачи: «Архитектура БД для поиска по параметрам»

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/%'

Объяснение кода листинга программы

  1. В этом коде происходит выборка из таблицы products_cache
  2. Выбирается столбец id_product
  3. Условие WHERE применяется для фильтрации результатов
  4. Фильтр по цене: price должен быть между $old_price и $new_price (включая их)
  5. Фильтр по бренду: id_brand должен быть равен $id_brand
  6. Фильтр по опциям: options должен содержать $option1 (как подстроку)
  7. Фильтр по опциям: options должен содержать $option2 (как подстроку)
  8. Значения переменных: $old_price, $new_price, $id_brand, $option1, $option2 должны быть определены до выполнения этого запроса.
  9. Этот запрос возвращает id_product для продуктов, которые соответствуют всем условиям.
  10. Этот запрос может быть использован для поиска продуктов с заданными опциями и ценовым диапазоном, и он может быть оптимизирован с помощью индексов на столбцах price, id_brand и options.
  11. Запрос не включает любые другие столбцы, кроме id_product, поэтому он будет быстрым и эффективным.
  12. Если любое из условий WHERE не будет выполнено, то соответствующий продукт не будет возвращен в результате.
  13. Если значения переменных $old_price, $new_price, $id_brand, $option1, $option2 не определены, то этот запрос не будет работать.
  14. Этот запрос может быть выполнен с помощью любого SQL-клиента, который поддерживает выполнение SQL-запросов.
  15. Этот запрос может быть запущен из любого языка программирования, который может выполнять SQL-запросы.
  16. Этот запрос может быть адаптирован для работы с другими таблицами и другими столбцами, но он должен быть точно настроен для правильной работы.
  17. Этот запрос может быть использован в более крупном SQL-запросе или в более крупной программе.
  18. Этот запрос может быть оптимизирован с помощью индексов на столбцах price, id_brand и options, чтобы ускорить его выполнение.
  19. Этот запрос может быть использован для поиска продуктов с определенными опциями и ценовым диапазоном.
  20. Этот запрос может быть изменен или адаптирован для работы с другими данными или требованиями.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5