PurpleSchool — курсы программирования онлайн
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развития
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    PostgreSQL vs MongoDB: что выбрать для проекта в 2025

    PostgreSQL vs MongoDB: что выбрать для проекта в 2025

    Аватар автора PostgreSQL vs MongoDB: что выбрать для проекта в 2025

    Антон Ларичев

    Иконка календаря06 июня 2026
    postgresqlmongodbdatabasesbackendmiddleИконка уровня middle
    Картинка поста PostgreSQL vs MongoDB: что выбрать для проекта в 2025

    Введение

    Выбор базы данных — одно из самых дорогих архитектурных решений. Сменить ORM или фреймворк можно за неделю, а миграция между PostgreSQL и MongoDB растягивается на месяцы и часто требует переписывания бизнес-логики. В 2025 году граница между реляционными и документными СУБД размылась: PostgreSQL умеет работать с JSONB не хуже специализированных решений, а MongoDB добавила полноценные ACID-транзакции. Разберёмся, когда какой инструмент действительно уместен.

    Модель данных

    PostgreSQL — реляционная СУБД со строгой схемой. Вы заранее описываете таблицы, типы колонок, ограничения и внешние ключи. Это даёт предсказуемость и защищает от мусора в данных.

    -- Создание таблицы пользователей с ограничениями
    CREATE TABLE users (
        id BIGSERIAL PRIMARY KEY,
        email VARCHAR(255) UNIQUE NOT NULL,
        created_at TIMESTAMPTZ DEFAULT NOW(),
        -- JSONB позволяет хранить произвольные настройки
        settings JSONB DEFAULT '{}'
    );
    
    CREATE INDEX idx_users_settings ON users USING GIN (settings);
    

    MongoDB хранит данные как BSON-документы в коллекциях. Схема гибкая: два документа в одной коллекции могут иметь разный набор полей.

    // Вставка документа произвольной структуры
    await db.collection('users').insertOne({
        email: 'user@example.com',
        createdAt: new Date(),
        // Вложенные объекты без отдельных таблиц
        profile: {
            name: 'Анна',
            interests: ['backend', 'devops']
        }
    });
    

    Правило простое: если предметная область устоявшаяся и связи между сущностями важны — берите PostgreSQL. Если структура документа меняется часто, либо документы по своей природе иерархичны (товары маркетплейса, события аналитики) — MongoDB снимет головную боль с миграциями.

    Транзакции и целостность

    Исторически это был главный козырь PostgreSQL: полноценные ACID-транзакции с несколькими уровнями изоляции.

    BEGIN;
    -- Списываем деньги у отправителя
    UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
    -- Зачисляем получателю
    UPDATE accounts SET balance = balance + 1000 WHERE id = 2;
    -- Если что-то пойдёт не так, изменения откатятся
    COMMIT;
    

    MongoDB с версии 4.0 поддерживает многодокументные транзакции, а с 5.0 они работают и в шардированных кластерах.

    const session = client.startSession();
    try {
        await session.withTransaction(async () => {
            // Обе операции либо выполнятся, либо откатятся вместе
            await accounts.updateOne({ _id: 1 }, { $inc: { balance: -1000 } }, { session });
            await accounts.updateOne({ _id: 2 }, { $inc: { balance: 1000 } }, { session });
        });
    } finally {
        await session.endSession();
    }
    

    Но есть нюанс: транзакции в MongoDB обходятся дороже по латентности и не предназначены для высоконагруженных сценариев. Если у вас финтех, биллинг или склад — PostgreSQL по-прежнему безопаснее.

    Запросы и индексы

    SQL даёт мощный декларативный язык: JOIN, оконные функции, CTE, материализованные представления. Для аналитических отчётов это незаменимо.

    -- Топ-5 авторов по числу публикаций за месяц
    SELECT u.email, COUNT(p.id) AS posts_count
    FROM users u
    JOIN posts p ON p.author_id = u.id
    WHERE p.created_at > NOW() - INTERVAL '30 days'
    GROUP BY u.email
    ORDER BY posts_count DESC
    LIMIT 5;
    

    MongoDB предлагает aggregation pipeline — последовательность стадий обработки документов.

    const topAuthors = await db.collection('posts').aggregate([
        // Фильтруем посты за последние 30 дней
        { $match: { createdAt: { $gte: new Date(Date.now() - 30 * 24 * 3600 * 1000) } } },
        // Группируем по автору и считаем количество
        { $group: { _id: '$authorId', postsCount: { $sum: 1 } } },
        { $sort: { postsCount: -1 } },
        { $limit: 5 }
    ]).toArray();
    

    Для простых выборок по ключу разница незаметна. Для сложной аналитики с пятью JOIN PostgreSQL выигрывает по выразительности и оптимизатору.

    Масштабирование

    MongoDB изначально проектировалась под горизонтальное масштабирование через шардирование. Достаточно выбрать shard key — и кластер сам распределит данные.

    PostgreSQL традиционно масштабируется вертикально и через реплики на чтение. Шардирование возможно (Citus, partitioning), но требует ручной работы. Если вы заранее знаете, что данные не поместятся на один узел и нужны сотни терабайт — MongoDB снимет часть инженерных задач.

    Частые ошибки

    Выбор MongoDB ради «гибкости», когда данные строго реляционные. Через полгода вы вручную пишете JOIN на клиенте и теряете согласованность. Если сущности связаны внешними ключами — это сигнал в пользу PostgreSQL.

    Хранение всего в JSONB в PostgreSQL. JSONB удобен для редко меняющихся атрибутов, но если 80% полей лежат внутри JSON, вы теряете типизацию и индексацию. Выносите горячие поля в колонки.

    Игнорирование индексов в MongoDB. Без индекса коллекция в миллион документов превращает любой запрос в полное сканирование. Анализируйте план через explain('executionStats').

    Многодокументные транзакции в MongoDB как замена реляционной модели. Они работают, но платой будет рост латентности и блокировок. Если транзакций много — берите PostgreSQL.

    Отсутствие бэкапов и проверки восстановления. Любая СУБД бесполезна, если вы не умеете поднять её из бэкапа за разумное время.

    Заключение

    В 2025 году выбор сводится к простому принципу: PostgreSQL — дефолт для большинства бизнес-приложений, особенно где важны транзакции, отчётность и долгоживущая схема. MongoDB уместна, когда документная модель естественна для домена, нужна гибкая схема или планируется горизонтальное масштабирование с самого старта. Многие команды используют обе СУБД одновременно: PostgreSQL держит ядро данных, а MongoDB — события, логи или товарный каталог. Главное — принимать решение исходя из характера нагрузки и команды, а не из моды.

    Иконка глаза10

    Комментарии

    0

    Постройте личный план изучения HTML и CSS - полный курс по вёрстке с нуля до уровня Middle — бесплатно!

    HTML и CSS - полный курс по вёрстке с нуля — часть карты развития Frontend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Основы JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Продвинутый JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    TypeScript с нуля

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Docker для разработчика: полный гайд с нуля до продакшена
    Иконка аватараАнтон
    Иконка календаря03 июня 2026
    dockerdevopsконтейнеризация+ 1juniorИконка уровня junior

    Docker для разработчика: полный гайд с нуля до продакшена

    Docker для разработчика — полный гайд с нуля: образы, контейнеры, Dockerfile, docker-compose и работа с продакшеном простыми словами.

    Иконка чипа0
    Иконка глаза149
    Иконка комментариев0
    Картинка поста Git для разработчика: ветки, merge, rebase и командная работа
    Иконка аватараАнтон
    Иконка календаря05 июня 2026
    GitВерсионный контрольКомандная разработка+ 1middleИконка уровня middle

    Git для разработчика: ветки, merge, rebase и командная работа

    Git для разработчика: разбираем ветки, merge и rebase, работу с конфликтами и правила командной разработки на реальных примерах.

    Иконка чипа0
    Иконка глаза36
    Иконка комментариев0
    Картинка поста Асинхронность в JavaScript: Event Loop, промисы и async/await
    Иконка аватараАнтон
    Иконка календаря04 июня 2026
    JavaScriptАсинхронностьEvent Loop+ 2middleИконка уровня middle

    Асинхронность в JavaScript: Event Loop, промисы и async/await

    Разбираем асинхронность в JavaScript: как работает Event Loop, чем промисы лучше колбэков и зачем нужен async/await на практике.

    Иконка чипа0
    Иконка глаза66
    Иконка комментариев0
    Иконка чипа0