> Как работать со сложными запросами в PostgreSQL (JavaScript)
Уровень: senior · Роль: backend · Язык: JavaScript · Категория: Технические вопросы
Компании: ЭНИРАН
Стек: Node.js, PostgreSQL, JavaScript
> Пример ответа
Сложные запросы в PostgreSQL - это не про SQL, а про то, как фронтенд взаимодействует с базой через Node.js. Основная задача - избежать N+1 запросов и не тащить сырые данные на клиент.
На практике я использую следующие подходы:
- Агрегация на стороне БД. Вместо того чтобы делать 10 запросов для получения пользователей и их заказов, я пишу один запрос с
JOINиGROUP BY, а затем на Node.js (например, черезpgилиknex) собираю вложенную структуру. Пример:
JAVASCRIPTconst result = await pool.query(`SELECT u.id, u.name,json_agg(json_build_object('id', o.id, 'total', o.total)) AS ordersFROM users uLEFT JOIN orders o ON o.user_id = u.idGROUP BY u.id`);
На клиент уходит уже готовый JSON с вложенными заказами.
-
Оконные функции для пагинации и ранжирования. Вместо
LIMIT/OFFSET(который тормозит на больших данных) используюROW_NUMBER()илиNTILE. Это позволяет делать пагинацию с курсорами - передаёмlast_idи получаем следующую порцию. -
CTE (Common Table Expressions) для разбивки сложной логики на читаемые шаги. Например, сначала выбираем топ-категории, потом для каждой - товары. В Node.js это просто один запрос, который БД оптимизирует сама.
-
Индексы и EXPLAIN ANALYZE. Перед тем как писать сложный запрос, я смотрю план выполнения. Если вижу Seq Scan на таблице с миллионами строк - добавляю составной индекс. Для фронтенда критично, чтобы запрос выполнялся за <100 мс, иначе пользователь заметит задержку.
-
Материализованные представления для тяжёлых отчётов. Если дашборд требует данных, которые обновляются раз в час, я создаю материализованное представление и обновляю его по расписанию через
node-cron. Фронтенд просто делаетSELECT * FROM dashboard_view.
Главное правило: сложный запрос лучше написать один раз на SQL, чем 10 раз на JavaScript с циклами. PostgreSQL мощный - используйте его возможности, а не костыли на клиенте.
> Похожие задачи по JavaScript
Что такое GridFS в MongoDB
Расскажите про опыт работы с PostgreSQL
Что такое Redis Cluster
Расскажите про предметную область и проекты компании
> Похожие задачи по backend
Что такое GridFS в MongoDB
Расскажите про опыт работы с PostgreSQL
Что такое Redis Cluster
Как писать приложение для корректной работы в кластерном режиме с несколькими воркерами
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью