|
|
|
Оптимизация структуры БД и сложного запроса
|
|||
|---|---|---|---|
|
#18+
Товарисчи, я не являюсь гуру в области БД, поэтому мой вопрос знатокам может показаться ламерским, хотя сам я в полной растерянности и недоумении. Я проектирую базу данных медикаментов и у меня есть сложная структура взаимосвязанных таблиц: есть категории медикаментов, препараты, пилюли, пачки и упаковки (таблицы, соответственно: 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, если это имеет значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2007, 16:42 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34626718&tid=1544427]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
173ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 494ms |

| 0 / 0 |
