JavaRush /Курсы /Модуль 4: FastAPI /Основные отличия MongoDB от реляционных баз данных

Основные отличия MongoDB от реляционных баз данных

Модуль 4: FastAPI
8 уровень , 8 лекция
Открыта

В добрый час, друзья! Мы уже успели окунуться в мир NoSQL и познакомиться с MongoDB, присмотрелись к её архитектуре и возможностям, и даже начали разрабатывать асинхронные запросы через FastAPI. Теперь пришло время поговорить о фундаментальных различиях между MongoDB и реляционными базами данных (SQL). Это тонкая, но крайне важная тема. Понимание этих различий помогает нам выбирать правильные инструменты для каждой конкретной задачи. Ведь как гласит народная мудрость программистов: "Если все, что у вас есть, это молоток, всё вокруг будет похоже на гвоздь".


Напоминание: реляционные и нереляционные базы данных

В реляционной модели данные организуются в таблицы с четко определенными колонками (с именами и типами данных). Например, если мы проектируем базу данных для хранения информации о пользователях и их заказах, структура может выглядеть так:

Таблица users:

id name email
1 Иван ivan@test.ru
2 Анна anna@test.ru

Таблица orders:

id user_id product amount
1 1 Книга 500
2 2 Лампа 1200

Здесь связь между пользователями (users) и их заказами (orders) осуществляется через внешний ключ user_id. Это явная, строгая связь между сущностями.

В MongoDB же данные хранятся в коллекциях, а каждый документ может иметь произвольную структуру. Например, для того же сценария с пользователями и заказами можно представить данные в виде:

Коллекция users:

{
  "name": "Иван",
  "email": "ivan@test.ru",
  "orders": [
    { "product": "Книга", "amount": 500 },
    { "product": "Лампа", "amount": 1200 }
  ]
}

Документы MongoDB не требуют явной связи через внешние ключи. Вместо этого мы можем встроить (embed) связанные данные прямо в документ. Этот подход называется денормализацией данных и значительно упрощает доступ к данным в некоторых ситуациях.

Сравнение подходов

Характеристика Реляционные базы данных MongoDB
Моделирование данных Разделение данных на таблицы, строгая схема Документы и коллекции, гибкая структура
Связи данных Четкие связи через внешние ключи Денормализация или ссылки (references)
Изменение структуры Сложнее: нужно изменять схему таблицы Легче: можно добавлять поля "на лету"

Производительность и масштабируемость

MongoDB и реляционные базы данных по-разному подходят к обработке данных, масштабированию, и обеспечению производительности, особенно под большими нагрузками.

Реляционные базы данных изначально создавались с учетом вертикального масштабирования. Это означает, что для увеличения производительности серверные ресурсы (CPU, память, диски) должны усиливаться. Однако этот подход утратил актуальность с возросшими требованиями современного мира.

MongoDB поддерживает горизонтальное масштабирование "из коробки". Горизонтальное масштабирование означает добавление новых серверов в кластер вместо усовершенствования одного сервера. Благодаря механизму шардирования MongoDB распределяет данные между несколькими узлами (шардами), что делает её идеальной для работы с большими объемами данных.

Реляционные базы данных часто быстрее для операций, связанных с сложными связями (например, JOIN запросами). Они оптимизированы для таких сценариев, как создание отчетов или сложных аналитических запросов. MongoDB быстрее при работе с большими объемами документов, например, для чтения данных, если индексирован ключ.

Характеристика Реляционные базы данных MongoDB
Масштабирование Вертикальное, сложное горизонтальное Горизонтальное, простое шардирование
Производительность на больших данных Снижается из-за JOIN-операций Высокая при использовании индексов

Пример: подготовка отчета

Работа с отчетами, где нужно агрегировать данные из нескольких таблиц в SQL, выглядит элегантно с помощью JOIN. MongoDB этого не поддерживает, но предоставляет мощный механизм агрегаций, который позволяет выполнять сложные вычисления непосредственно в базе.

Пример запроса агрегата в MongoDB:


pipeline = [
    {"$unwind": "$orders"},
    {"$group": {"_id": "$name", "total_spent": {"$sum": "$orders.amount"}}}
]
result = db.users.aggregate(pipeline)

Этот запрос собирает итоговые суммы, потраченные каждым пользователем на товары.


Специфика транзакций и управления целостностью данных

Реляционные базы данных поддерживают транзакции, соответствующие ACID-принципам (атомарность, согласованность, изоляция, надежность). Это делает их выбором номер один, когда важна строгая согласованность данных, например, при банковских операциях. Вы можете быть уверены, что либо все изменения в базе завершатся успешно, либо никакие изменения не будут выполнены.

Пример транзакции в SQL:


BEGIN TRANSACTION;
UPDATE bank_account SET balance = balance - 100 WHERE id = 1;
UPDATE bank_account SET balance = balance + 100 WHERE id = 2;
COMMIT;

Транзакции в MongoDB

До версии 4.0 MongoDB считалась базой данных без транзакций. Это было связано с тем, что данные внутри одного документа всегда считались консистентными (т.е. MongoDB гарантировала целостность на уровне документа). Однако начиная с версии 4.0, MongoDB поддерживает многодокументные транзакции.

Пример транзакции в MongoDB:


with client.start_session() as session:
    with session.start_transaction():
        db.bank_account.update_one(
            {"id": 1}, {"$inc": {"balance": -100}}, session=session
        )
        db.bank_account.update_one(
            {"id": 2}, {"$inc": {"balance": 100}}, session=session
        )

Хотя транзакции теперь есть, они используются реже, так как архитектура MongoDB рассчитана на частые вставки и запросы, а не сложные изменения.

Сравнение

Характеристика Реляционные базы данных MongoDB
Поддержка транзакций Полная поддержка ACID ACID на уровне документа, частичная поддержка многодокументных транзакций
Целостность данных Высокая, строгое соблюдение схемы Зависит от структуры приложения

Когда выбрать MongoDB, а когда — SQL?

Реляционные базы данных подходят, если:

  • Вам требуется строгая схема и сложные связи между данными.
  • Ваши запросы содержат множество JOIN операций.
  • Вы разрабатываете приложение, где важна фин. точность (например, бухгалтерские системы).

MongoDB актуальна, если:

  • Вы работаете с большим объемом данных, требующим горизонтального масштабирования.
  • Данные плохо структурированы (лог файлов, JSON, документы).
  • Вам важно работать с гибкими схемами и быстрыми операциями чтения/записи.

Итак, выбор базы данных зависит от специфики проекта. Помните, что SQL и NoSQL — не конкуренты, а инструменты для разных ситуаций. Как мастер выбирает отвертку или молоток по задаче, так и вы должны осознанно подходить к выбору технологии!

1
Задача
Модуль 4: FastAPI, 8 уровень, 8 лекция
Недоступна
Запрос и агрегация
Запрос и агрегация
1
Задача
Модуль 4: FastAPI, 8 уровень, 8 лекция
Недоступна
Создание реляционной структуры в MongoDB
Создание реляционной структуры в MongoDB
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ