Стоит ли использовать MongoDB в Django

Стоит ли использовать MongoDB в Django
👋
Хочешь поучаствовать в жизни сайта? Мы ищем авторов!
Перевод статьи When to Use MongoDB with Django автора Daniel Roy Greenfeld

Короткий ответ

Не стоит

Развернутый ответ

Прежде всего, давайте разберемся с одной вещью. Это не удар по MongoDB. MongoDB отлично работает со многими вещами (FastAPI, Flask, node и так далее), но не соответствует Django. Другими словами, эта статья посвящена использованию правильного инструмента для правильной работы.

Во-вторых, я говорю не от незнания. На самом деле, у меня довольно большой опыт объединения MongoDB и Django. Вы можете найти некоторые мои ранние работы по объединению этих инструментов в несуществующем файле django-mongonaut.

Хорошо, тогда давайте перейдем к предыстории этого поста: на различных справочных форумах Django вы можете видеть вопросы от новичков в Django о том, как использовать MongoDB с Django. В большинстве случаев они хотят заменить Django ORM вызовами MongoDB. Вот причины, которые я видел.

Причина 90%: JSON хранилище

В большинстве случаев люди хотят заменить SQL на MongoDB в Django, причина в том, что они хотят хранить данные в формате JSON и выполнять по ним поиск.

В этом случае им следует использовать встроенную в Django реализацию MariaDB, MySQL 5.7.8+, Oracle, PostgreSQL и поле JSON SQLite. Это не просто строковое поле, оно полностью доступно для поиска. Пример реализации:

from django.db import models

class Product(models.Model):
    metadata = models.JSONField(null=True, blank=True)

Просто сохраните свои данные в это поле, используя JSON-сериализуемый словарь. Это просто. Более того, в этой предыдущей статье я показал, как можно красиво распечатать JSON в админке Django.

Используя это поле, вы получаете все встроенные функции Django и поле JSON с возможностью поиска без путаницы, связанной со встраиванием нереляционной базы данных (MongoDB) в структуру и динамичную экосистему, предназначенную для работы с реляционными базами данных (Django).

Причина 5%: Производительность

Некоторые люди хотят использовать MongoDB с Django из-за предполагаемых соображений производительности. Конечно, если вы запустите MongoDB без каких-либо гарантий записи и решите отказаться от транзакций базы данных, она будет работать быстрее, чем любое реляционное хранилище. Однако это опасно ненадежный подход к вещам. Это просто не стоит риска повреждения данных.

Не верьте мне на слово, потратьте час на поиск статей о безопасности записи в MongoDB. Не обращайте внимания на рекламные статьи, опубликованные на mongodb.com, читайте, что говорят реальные бизнес-кейсы и проекты.

Кроме того, если вы хотите ускорить ввод-вывод базы данных с помощью Django - стандартной практикой является использование асинхронных инструментов, таких как Celery, перед переключением хранилища данных.

Причина 4%: Масштабирование

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

Опять же, не верьте мне на слово, потратьте час на поиск статей о проблемах масштабирования с MongoDB. Опять же, игнорируйте маркетинг и читайте реальные кейсы.

Причина 1%: Менеджмент

Время от времени кто-то говорит мне, что использование MongoDB с Django — это решение руководства. В этом случае они должны отправить своего босса (ов) в этот пост в блоге.

Руководство должно знать, что Django предназначен для использования с серверной частью реляционной базы данных (PostgreSQL, MySQL) и хранилищем ключей/значений для эфемерных данных (Redis, Memcached). Выход за рамки этого дизайна замедлит разработку и расстроит команду. Даже если ваша команда сможет обойти эту проблему, им будет мешать то, что они не смогут в полной мере использовать инструменты в экосистеме Django.

Что насчет Djongo, django-nonrel и прочего?

Некоторые люди утверждают, что сторонние инструменты, такие как Djongo, создают простые в использовании мосты между MongoDB и Django. Что они предоставляют соединитель БД, который поможет вам почти на всем пути. Создатели/сопровождающие этих пакетов прилагают героические усилия для того, чтобы это произошло.

Все, о чем вам нужно беспокоиться, это нечетный пограничный случай, верно?

К сожалению, это крайние случаи, которые являются проблемой. Пограничные случаи могут сделать невозможным дальнейшую работу без проблемного хакерства. Я знаю, что это правда, поскольку я сам прошел этот путь.

Ситуация усложняется тем, что если обслуживание пакета моста Django/MongoDB прекращается, то что тогда? Экосистема Django усеяна мертвыми коннекторами Django/MongoDB.

Проблема в том, что Django настолько глубок и сложен, что абстракция MongoDB требует много тщательной и кропотливой работы. Каждый выпуск Django значительно усложняет обслуживание моста. Для справки, Djongo, проект, созданный с замечательным мастерством и усилиями, по состоянию на 12 августа 2022 года не обновлялся два месяца. Это не критика сопровождающих Djongo (чьими талантами я восхищаюсь), а скорее реалистичная оценка проблем, связанных с поддержкой соединителя моста, отличного от SQL, с Django.

Если вам нужно использовать MongoDB, используйте вместо этого FastAPI или Flask

В MongoDB нет ничего плохого. Однако это не оптимально при использовании с Django. Если вы используете его с правильными правами на запись, MongoDB не дает никаких преимуществ в скорости с Django. Вы также теряете многие преимущества Django (транзакции базы данных, надежная безопасность, формы, простота использования Django REST framework, сотни сторонних пакетов и тому подобное). Там довольно много вещей, которые вам придется переписать.

И если вам придется переписать большую часть функциональности Django для использования MongoDB, вы также можете использовать FastAPI или Flask. Честно говоря, это неплохой выбор, поскольку гибкость этих инструментов делает их идеальными для использования с нереляционными базами данных.

Я знаю, потому что раньше у меня были и FastAPI, и Flask, а не реляционные данные. Я создал десятки микросервисов, использующих DynamoDB. Хотя DynamoDB не является MongoDB, они достаточно похожи, и я могу сказать вам, что этот подход восхитителен.

Материал подготовлен с ❤️ редакцией Кухни IT.

Александр Вагнер

Александр Вагнер

Middle Full Stack Developer