powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Оптимизация структуры БД и сложного запроса
1 сообщений из 1, страница 1 из 1
Оптимизация структуры БД и сложного запроса
    #34626718
uniqus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Товарисчи, я не являюсь гуру в области БД, поэтому мой вопрос знатокам может показаться ламерским, хотя сам я в полной растерянности и недоумении. Я проектирую базу данных медикаментов и у меня есть сложная структура взаимосвязанных таблиц: есть категории медикаментов, препараты, пилюли, пачки и упаковки (таблицы, соответственно: categories, drugs, pills, packs, boxes, box_contents). В каждой категории может быть несколько препаратов (связь 1 ко многим), каждый препарат формируется в пилюли различного веса (опять 1 ко многим), пилюли одного препарата одинакового веса пакуются в пачки (1 ко многим), пачки складываются в коробки (многие ко многим, в одной коробке может лежать несколько разных пачек разных пилюль). Структура (обрезанная) приблизительно такая:

categories (category_name, category_id), drugs (drug_id, category_id, drug_name), pills (drug_id, weight), packs (pill_id, num_pills), boxes(box_id), box_contents(box_id, pack_id, num_packs).

Это структура общего склада медикаментов. Но имеется еще несколько магазинов (таблица stores), в каждом из которых могут продаваться те или иные боксы. Боксы, продающиеся в определенных магазинах, заносятся в таблицу store_products.

Таблицы: stores(store_id, store_name), store_products(store_id, box_id).

Так вот, вопрос в следующем: как будет выглядеть наиболее оптимальный запрос выборки для определенного магазина (store_id) всех коробок (boxes), содержащих медикаменты в заданной категории (category_id)? И/или запрос для выборки для этого магазина всех боксов (boxes), содержащих медикамент с заданным drug_id? Я пытался выбирать с помощью SELECT DISTINCT и серии LEFT JOIN'ов, пытался сделать вариант с подзапросом, в котором тоже серия LEFT JOIN'ов, но что-то меня уже начинает клинить, и я ни то ти другое никак не могу довести до ума. Может, есть смысл как-то разбить этот запрос на серию из нескольких запросов?

Всё, что я смог смастерить, это запрос для выборки наименований всех продающихся в определенном магазине медикаментов, принадлежащих определенной категории:

SELECT DISTINCT d.* FROM store_products AS s LEFT JOIN boxes AS b USING (box_id) LEFT JOIN box_contents AS bc USING (box_id) LEFT JOIN packs AS pk USING (pack_id) LEFT JOIN pills USING (pill_id) LEFT JOIN drugs AS d USING (drug_id) WHERE store_id = {$sid} AND d.category_id = {$cid}

{$cid} и {$sid} заменяются соответствующими значениями category_id и store_id

Ну или запрос попроще, для выборки всех непустых категорий для заданного store_id:

SELECT DISTINCT ON (c.category_name) c.* FROM categories AS c WHERE category_id IN (SELECT category_id FROM store_products AS s LEFT JOIN boxes AS b USING (box_id) WHERE store_id = {$sid}) ORDER BY category_name ASC

Если можно, прокомментируйте, пожалуйста, эти запросы: насколько они оптимальны и как их можно упростить/оптимизировать.
И самое главное: помогите разобраться с запросом, о котором речь идет в начале поста.
Заранее спасибо.

P.S. БД на PostgreSQL, если это имеет значение.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Оптимизация структуры БД и сложного запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]