PostgreSQL: что это, где применяется и как освоить
PostgreSQL — свободная реляционная СУБД, на которой работают интернет-магазины, банковские сервисы, CRM и учётные системы. Разработчик в ней создаёт таблицы и миграции, пишет запросы из приложения, хранит в столбцах JSONB и массивы, проверяет через EXPLAIN, почему запрос тормозит, и решает, что будет, если две транзакции одновременно меняют одну строку. Аналитик выгружает данные, строит отчёты оконными функциями и читает план тяжёлого запроса. Отдельно освоить стоит расширения вроде PostGIS и pg_stat_statements, отличия от MySQL и SQLite и границу, за которой нужен администратор баз данных.
Содержание

Главное, что отличает навык «PostgreSQL» от общего умения писать SQL, — знание поведения конкретной СУБД. Один и тот же запрос на PostgreSQL и MySQL может вернуть разный результат при параллельной работе, а тип столбца, который в одной системе считается экзотикой, в другой решает задачу без лишней таблицы. На учебной базе, где вы единственный пользователь, эти подробности не видны.
Что делают с PostgreSQL каждый день
Backend-разработчик описывает таблицы в миграциях, выбирает типы и ограничения, пишет запросы через ORM или вручную, добавляет индексы и оборачивает оформление заказа в транзакцию, чтобы деньги и остатки менялись вместе.
Аналитик чаще читает, чем пишет. Он соединяет заказы с клиентами, считает выручку по неделям оконными функциями, достаёт поля из JSON-событий, которые мобильное приложение складывает одним столбцом. Ему важно не положить рабочую базу запросом на полчаса.
Типы данных, ради которых выбирают PostgreSQL
Для JSON есть два типа, и документация PostgreSQL о типах JSON прямо советует большинству приложений jsonb: он хранится в разобранном двоичном виде, поэтому медленнее записывается, но заметно быстрее обрабатывается и поддерживает индексы. Цена — jsonb не сохраняет порядок ключей и пробелы, а из повторяющихся ключей оставляет последний. Если внешний сервис подписывает JSON и проверяет подпись по исходному тексту, храните его в json или text.
Массивы позволяют держать теги товара в одном столбце text[] и искать товары с тегом «скидка» без отдельной таблицы связей. Но если у тега появляются свои свойства (кто и когда его добавил), лучше вернуться к обычной таблице.
PostgreSQL, MySQL и SQLite: когда что брать
SQLite — не сервер, а библиотека: база лежит одним файлом внутри приложения. Разработчики SQLite сами пишут на странице о том, когда её применять, что читателей может быть сколько угодно, но писать в каждый момент может только один. Для мобильного приложения или прототипа этого хватает, для сайта с сотнями одновременных заказов — нет.
MySQL и PostgreSQL решают похожие задачи, и выбор часто определяется тем, что уже есть в компании. Но у них разные настройки по умолчанию: в MySQL с движком InnoDB стандартный уровень изоляции — REPEATABLE READ, а в PostgreSQL — Read Committed. Поэтому код после переезда может иначе вести себя при одновременных запросах.
Учебный пример: последний товар на складе
Ситуация учебная. В магазине остался один экземпляр кроссовок, и два покупателя одновременно нажимают «Оформить». Приложение в каждой сессии сначала читает остаток запросом SELECT stock FROM products WHERE id = 7, видит 1, проверяет в коде, что товар есть, и записывает новое значение: UPDATE products SET stock = 0 WHERE id = 7. Оба заказа создаются, остаток равен нулю, а продано две пары.
Каждый запрос по отдельности верен, дело в уровне изоляции. В разделе 13.2 документации PostgreSQL 18 сказано, что по умолчанию используется Read Committed: каждый запрос видит данные, зафиксированные до его начала, и два SELECT внутри одной транзакции могут увидеть разное. Обе сессии прочитали остаток до того, как другая его изменила, и вторая запись просто затёрла первую. Такую аномалию называют потерянным обновлением.
Исправить можно тремя способами. Первый — перенести проверку в сам UPDATE: SET stock = stock — 1 WHERE id = 7 AND stock > 0. Документация описывает, что происходит со второй сессией: она ждёт, пока первая зафиксирует изменения, затем заново проверяет условие WHERE на обновлённой версии строки. Остаток уже 0, строка под условие не подходит, обновлено ноль строк, и приложение сообщает второму покупателю, что товар закончился. Второй способ — прочитать строку с блокировкой через SELECT … FOR UPDATE: вторая сессия подождёт первую, но при высокой нагрузке очереди растут. Третий — уровень SERIALIZABLE. PostgreSQL реализует его через Serializable Snapshot Isolation: не блокирует заранее, а отслеживает зависимости между транзакциями и одну из них откатывает с ошибкой, у которой код SQLSTATE 40001. По документации приложение должно в этом случае повторить всю транзакцию с начала, так что без кода повтора SERIALIZABLE включать бессмысленно.
EXPLAIN и расширения
EXPLAIN показывает план, который выбрал планировщик, а EXPLAIN ANALYZE ещё и выполняет запрос и выводит фактическое время и число строк на каждом шаге. Смотреть стоит на расхождение ожидаемого и реального числа строк: если планировщик ждал 10 строк, а получил 200 тысяч, он, скорее всего, выбрал неудачный способ соединения. EXPLAIN ANALYZE для UPDATE и DELETE действительно меняет данные, поэтому такие запросы проверяют в транзакции с откатом.
Расширения добавляют возможности без смены СУБД. PostGIS даёт типы и функции для геоданных: найти пункты выдачи в радиусе двух километров от адреса покупателя можно одним запросом. pg_stat_statements собирает статистику по всем запросам и показывает, какие из них суммарно съедают больше всего времени. Подключают его в настройках сервера, поэтому обычно это делает администратор.
С чего начать и в каком порядке осваивать
Пока вы не пишете уверенно запросы, план выполнения читать не на чем. Пока нет своей схемы с данными, не на чем проверять типы и индексы. А транзакции и изоляция понятны только тогда, когда вы сами открыли два окна и увидели, как одна сессия ждёт другую. Поэтому шаги идут от запроса к поведению базы под нагрузкой.
- Установите PostgreSQL и клиент: консольный psql и графический DBeaver или pgAdmin.
- Освойте выборку, соединения, группировку, подзапросы и оконные функции на открытом наборе данных.
- Спроектируйте небольшую схему: первичные и внешние ключи, ограничения, типы numeric, timestamptz, jsonb, массивы.
- Заполните таблицы сотнями тысяч строк и учитесь читать EXPLAIN ANALYZE до и после создания индекса.
- Разберите транзакции и уровни изоляции на двух параллельных сессиях.
- Подключите одно расширение под свою задачу: PostGIS для геоданных или pg_stat_statements для поиска медленных запросов.
С запросами можно познакомиться бесплатно: курс Хекслета «Основы SQL» по описанию на Учи.Онлайн включает 25 уроков, 25 упражнений и 93 проверочных теста прямо в браузере, без установки базы. Там есть даже блок о транзакциях, но соединений, подзапросов и оконных функций нет — их осваивайте уже на своей установке.
Упражнения и типичные ошибки
Главное упражнение — повторить пример со складом. Откройте два окна psql, в каждом начните транзакцию, прочитайте остаток и запишите новое значение, фиксируя изменения в разном порядке. Затем повторите то же с условием stock > 0 внутри UPDATE, с FOR UPDATE и с уровнем SERIALIZABLE.
Типичные ошибки новичков: хранить деньги в float вместо numeric, даты — строками, всё подряд складывать в jsonb, хотя у полей постоянная структура и по ним нужны связи и ограничения. Ещё одна — оставлять транзакцию открытой, пока приложение ходит во внешний сервис: блокировки держатся всё это время, и соседние запросы выстраиваются в очередь. Проверяйте каждый запрос вопросом: что будет, если такой же в ту же секунду придёт от второго пользователя?
Разработчику, которому нужна программа с проектами на PostgreSQL, подойдёт онлайн-курс Яндекс Практикума «SQL для разработки». По описанию на Учи.Онлайн, это четыре месяца примерно по 10 часов в неделю, 54 часа теории и 56 часов практики, стоимость — 71 500 ₽. В программе транзакции, индексы, процедуры и триггеры на PL/pgSQL, геоданные и четыре проекта, среди них ускорение запросов службы доставки через индексы. Совсем новичкам без технической базы школа эту программу не рекомендует.
Когда нужен администратор баз данных
Разработчик и аналитик отвечают за свои запросы и схему, а сервер целиком — забота администратора баз данных: резервные копии и восстановление, реплики, обновление версий, настройка памяти и фоновой очистки, права доступа. Эту работу разбирает наша статья о профессии администратора баз данных. Признаки того, что DBA нужен: нет проверенной копии, запросы замедляются без изменений в коде, таблицы растут без видимых причин.
Как PostgreSQL влияет на доход
Для backend-разработчика PostgreSQL обычно входит в обязательные требования вакансии, а не даёт отдельную надбавку. Для аналитика это умение, с которым берут задачи сложнее готовых отчётов. В калькуляторе зарплат «Хабр Карьеры» в конце сентября 2026 года для специализации «Аналитик по данным» с навыком PostgreSQL была указана зарплата 184 000 ₽ в месяц по России для всех уровней вместе, но расчёт сделан всего по 27 анкетам. Для всей специализации без фильтра по навыку — 170 416 ₽ по 1 125 анкетам.
Разницу нельзя считать премией за PostgreSQL: выборка с навыком слишком мала, а подробно заполняют навыки чаще опытные специалисты. Практичнее сравнить вакансии своей должности в своём городе с PostgreSQL в требованиях и без него и уточнять, указана сумма до вычета налога или на руки.
Как выбрать обучение
Проверьте в программе четыре вещи: идёт ли обучение именно на PostgreSQL, есть ли задания с EXPLAIN на таблицах в сотни тысяч строк, разбирают ли транзакции на параллельных сессиях и кто проверяет практику.
Аналитикам, которые хотят уверенно писать запросы к рабочей базе, подойдёт онлайн-курс Нетологии «SQL и получение данных». По описанию на Учи.Онлайн, это девять недель и 16 занятий на PostgreSQL с тренажёром: соединения, подзапросы, оконные функции и индексы, цена со скидкой на момент проверки — 37 000 ₽. Подробного плана занятий в обзоре нет, поэтому до оплаты уточните у школы, сколько в программе практики и как её проверяют.
Если база для вас часть другой работы, например разработки на Django, программа по администрированию будет лишней: выбирайте ту, что закрывает следующий шаг.
Сравнить онлайн-школы по цене и формату можно в рейтинге школ, обучающих SQL и базам данных для разработчиков. Рейтинг шире темы PostgreSQL, и на момент проверки подробно в нём была разобрана одна программа, поэтому условия сверяйте и на сайтах школ.
Если вы можете объяснить, почему два покупателя в примере купили один товар, и исправить это одним запросом, базовый уровень у вас уже есть. Дальше выбирайте направление: для разработчика — индексы и план выполнения, для аналитика — оконные функции и работа с JSON.