> Как работать со сложными запросами в PostgreSQL (JavaScript)

Уровень: senior · Роль: backend · Язык: JavaScript · Категория: Технические вопросы

Компании: ЭНИРАН

Стек: Node.js, PostgreSQL, JavaScript

> Пример ответа

Сложные запросы в PostgreSQL - это не про SQL, а про то, как фронтенд взаимодействует с базой через Node.js. Основная задача - избежать N+1 запросов и не тащить сырые данные на клиент.

На практике я использую следующие подходы:

  1. Агрегация на стороне БД. Вместо того чтобы делать 10 запросов для получения пользователей и их заказов, я пишу один запрос с JOIN и GROUP BY, а затем на Node.js (например, через pg или knex) собираю вложенную структуру. Пример:
JAVASCRIPT
const result = await pool.query(`
SELECT u.id, u.name,
json_agg(json_build_object('id', o.id, 'total', o.total)) AS orders
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id
`);

На клиент уходит уже готовый JSON с вложенными заказами.

  1. Оконные функции для пагинации и ранжирования. Вместо LIMIT/OFFSET (который тормозит на больших данных) использую ROW_NUMBER() или NTILE. Это позволяет делать пагинацию с курсорами - передаём last_id и получаем следующую порцию.

  2. CTE (Common Table Expressions) для разбивки сложной логики на читаемые шаги. Например, сначала выбираем топ-категории, потом для каждой - товары. В Node.js это просто один запрос, который БД оптимизирует сама.

  3. Индексы и EXPLAIN ANALYZE. Перед тем как писать сложный запрос, я смотрю план выполнения. Если вижу Seq Scan на таблице с миллионами строк - добавляю составной индекс. Для фронтенда критично, чтобы запрос выполнялся за <100 мс, иначе пользователь заметит задержку.

  4. Материализованные представления для тяжёлых отчётов. Если дашборд требует данных, которые обновляются раз в час, я создаю материализованное представление и обновляю его по расписанию через node-cron. Фронтенд просто делает SELECT * FROM dashboard_view.

Главное правило: сложный запрос лучше написать один раз на SQL, чем 10 раз на JavaScript с циклами. PostgreSQL мощный - используйте его возможности, а не костыли на клиенте.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью