В настоящее время у меня есть три таблицы: формулы, видеоролики и статьи. Строки в таблице формул имеют отношение «много к одному» с видео и статьями.Правильный способ запроса нескольких отношений «много-к-одному» в 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);
Метод один, кажется зверским мне, и способ два кажется фрагментировано слишком много запросов.
Может ли кто-нибудь продемонстрировать лучший/более правильный способ запроса нескольких отношений «один-на-один»?
Несвязанный, но: предложение 'LIMIT' _without_ порядок не имеет смысла, поскольку значения, возвращаемые им, могут различаться между каждым исполнением. Каждое из трёх операторов _might_ возвращает другой набор 'formula_id'. Кроме того: 'LIMIT' применяется ко всему запросу, а не к одной таблице. 'из формул LIMIT 200' недействителен. –
@a_horse_with_no_name благодарит за сообщение! Если вы не можете сказать, что я работал с SQL в течение очень короткого промежутка времени, поэтому я очень благодарен за этот совет. – m0meni
Оба будут работать; в зависимости от размера и структуры таблицы, каждый из них будет иметь разные проблемы с производительностью. И ИМХО, «ужасно»; проанализировать их и посмотреть, какая из них лучше работает в ожидаемых условиях. – Piskvor