Использование Django JSONField как базы данных NoSQL в приложении для викторины

Я разрабатываю сайт-викторину на основе Django и хотел бы использовать JSONField в модели Quiz для хранения вопросов в манере, аналогичной NoSQL базам данных типа MongoDB. Я планирую хранить вопросы в виде JSON-данных непосредственно в модели Quiz (например, questions=models.JSONField())). Хотя это упрощает структуру и позволяет избежать джойнов, меня беспокоит, как это будет работать в отношении запросов и возможностей фильтрации. Каковы плюсы и минусы использования JSONField для большого набора данных в Django, учитывая этот подход? Как я могу оптимизировать производительность и масштабируемость? Любые советы или лучшие практики по управлению такой структурой будут очень признательны. Спасибо!

[Я] хотел бы использовать JSONField в модели викторины для хранения вопросов в манере, аналогичной NoSQL базам данных, таким как MongoDB.

Хранение данных в JSON-блобах в реляционной базе данных часто не является хорошей идеей, если только JSON-блобы не являются «атомарными». Другими словами, если вы не хотите фильтровать, агрегировать, обновлять, извлекать и т. д. части данных. Но в данном случае это не так, поэтому (с большой вероятностью) не хорошая идея.

Это означает, что каждый раз, когда вы получаете Quiz, будет получен весь JSON-блоб, что приведет к большим ответам от базы данных, делая систему менее отзывчивой. Хранение данных в нескольких таблицах обычно приводит к меньшим объемам данных для извлечения, агрегирования, фильтрации и т. д.

Хотя это упрощает структуру и позволяет избежать объединений

.
Как правило,

JOINы также не представляют особой проблемы. Если есть соответствующие индексы, а ForeignKey подразумевает индекс, то JOIN выполняется очень эффективно. Более серьезной проблемой является отсутствие фильтрации отношений, которые объединяются в JOIN, что снова приводит к (бесполезным) большим ответам от базы данных.

Использование JSON-блобов также означает, что у вас нет никаких гарантий относительно структуры JSON-блоба: можно определить Quiz как {"title": "My fancy quiz", questions: {"question": "What was the shortest light pulse ever produced?", "answer": "Just 43 attoseconds."}}, но можно просто засунуть [0, 1, 1, 8, 9, 9, 9, 8, 8, 1, 9, 9, 9, 1, 1, 9, 7, 2, 5, 3] в запись как данные. Реляционные базы данных предназначены для обеспечения определенной структуры данных, чтобы не вводить бессмысленные данные.

Djongo [GitHub] - это пакет, который по сути делает привязку MongoDb для Django, хотя и с неоднозначными результатами. Хотя Django сам по себе не требует реляционной базы данных, он в значительной степени ориентирован на нее, где модели объясняют, как выглядят такие колонки.

Реляционные базы данных действительно сегодня часто предлагают поле JSON и/или JSONB и даже могут выполнять поиск, фильтрацию и агрегирование. Но все равно эти инструменты часто работают не очень эффективно. Не только с точки зрения производительности, но и с точки зрения удобства: поиск в JSON-блобе должен быть определенного типа, поэтому требуется много приведений, дополнительный синтаксис для перемещения по JSON-блобу и т. д.

Вероятно, это не очень хорошая идея использовать ее таким образом, просто потому, что такая база данных, как PostgreSQL, изначально не была предназначена для работы таким образом, и хотя они, безусловно, приложили много усилий для ее улучшения, все равно потребуется много усилий для использования реляционных баз данных в NoSQL-подобном виде.

Вернуться на верх