2015-09-02 2 views
0

В настоящее время у меня есть три таблицы: формулы, видеоролики и статьи. Строки в таблице формул имеют отношение «много к одному» с видео и статьями.Правильный способ запроса нескольких отношений «много-к-одному» в PostgreSQL?

Мой API требуется вывести это соотношение в виде:

formulas: { 
    // some number of formulas 
} 
videos: { 
    // videos belonging to the formulas 
} 
articles: { 
    // articles belonging to the formulas 
} 

Я пришел с двумя различными способами, чтобы сделать запрос, который получит мне информацию, что мне нужно, но я боюсь, что из-за к моей неопытности с SQL не являются хорошими методами.

Метод первый кажется мне ужасной практикой, но он делает все это в одном запросе. Однако для этого также требуется, чтобы я сделал какое-то форматирование с результатами:

SELECT formulas.formula_id, 
     formulas.formula, 
     formulas.name, 
     array_agg(videos.link) AS video_links, 
     array_agg(videos.name) AS video_names, 
     array_agg(articles.link) AS article_links, 
     array_agg(articles.name) AS article_names 
FROM formulas LIMIT 200 
LEFT JOIN videos on videos.formula_id=formulas.formula_id 
LEFT JOIN articles on articles.formula_id=formulas.formula_id 
GROUP BY formulas.formula_id; 

Метод два кажется немного более нормальным. Это требует несколько запросов, которые не является концом света, но от того, что я прочитал, что лучше делать что-то только в одном запросе:

SELECT * FROM formulas LIMIT 200; 

SELECT * FROM videos WHERE formula_id IN (SELECT formula_id FROM formulas LIMIT 200); 

SELECT * FROM articles WHERE formula_id IN (SELECT formula_id FROM formulas LIMIT 200); 

Метод один, кажется зверским мне, и способ два кажется фрагментировано слишком много запросов.

Может ли кто-нибудь продемонстрировать лучший/более правильный способ запроса нескольких отношений «один-на-один»?

+3

Несвязанный, но: предложение 'LIMIT' _without_ порядок не имеет смысла, поскольку значения, возвращаемые им, могут различаться между каждым исполнением. Каждое из трёх операторов _might_ возвращает другой набор 'formula_id'. Кроме того: 'LIMIT' применяется ко всему запросу, а не к одной таблице. 'из формул LIMIT 200' недействителен. –

+0

@a_horse_with_no_name благодарит за сообщение! Если вы не можете сказать, что я работал с SQL в течение очень короткого промежутка времени, поэтому я очень благодарен за этот совет. – m0meni

+2

Оба будут работать; в зависимости от размера и структуры таблицы, каждый из них будет иметь разные проблемы с производительностью. И ИМХО, «ужасно»; проанализировать их и посмотреть, какая из них лучше работает в ожидаемых условиях. – Piskvor

ответ

0

Все зависит от того, что вы хотите сделать с результатами. Не существует единого «наилучшего» способа делать подобные вещи. Если это для отчета, я бы пошел на решение. Если это для интерактивного графического интерфейса, в котором пользователь сначала выбирает одну формулу, а затем вам нужно отображать связанные строки для этого, второй подход, вероятно, лучше. Или комбинация: один запрос, чтобы получить формулы и один, чтобы получить все связанные vidoes и статьи. Или что-то совсем другое. Если вы не сообщите нам, что вам нужно делать с результатами, на это почти невозможно ответить.