В чем основные различия между реляционной СУБД PostgreSQL и документной NoSQL БД MongoDB?

«В чем основные различия между реляционной СУБД PostgreSQL и документной NoSQL БД MongoDB?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PostgreSQL — это реляционная система управления базами данных (RDBMS), которая хранит данные в таблицах со строгой, предопределенной схемой. Для работы используется язык SQL. Она обеспечивает полную поддержку ACID-транзакций, сложные JOIN-запросы, ссылочную целостность и мощные механизмы индексации.

MongoDB — это документоориентированная NoSQL база данных. Данные хранятся в виде гибких JSON-подобных документов (BSON) внутри коллекций. Схема не является строгой (schema-less или schema-flexible). Оптимизирована для горизонтального масштабирования (шардирования) и работы с большими объемами неструктурированных или полуструктурированных данных.

Сравнительная таблица: Критерий PostgreSQL MongoDB
Модель данных Реляционная (таблицы, строки, столбцы) Документная (коллекции, документы BSON)
Схема Строгая, требует предварительного определения Гибкая, документы в одной коллекции могут иметь разную структуру
Язык запросов SQL (декларативный, мощный для сложных связей) Собственный API и агрегационный pipeline (императивный, хорош для вложенных данных)
Транзакции Полная поддержка ACID (включая распределенные) Поддержка ACID-транзакций на уровне одного документа (до версии 4.0). С версии 4.0+ — многодокументные транзакции.
Масштабирование Вертикальное (scale-up) и репликация. Горизонтальное (шардирование) сложнее. Горизонтальное (scale-out) через встроенное шардирование — основная сила.
Использование Системы с комплексными транзакциями, аналитика, отчетность, данные со сложными связями. Каталоги продуктов, контент-менеджмент, IoT, работа с данными, структура которых быстро меняется.

Пример запроса для поиска пользователей старше 25 лет:

PostgreSQL (SQL):

SELECT * FROM users WHERE age > 25;

MongoDB (JavaScript Shell):

db.users.find({ age: { $gt: 25 } });