Дети часто задаются вопросом - кто сильнее, кит или слон? каратист или боксер? В этой статье мы попробуем ответить на на похожий вопрос, сравнив SQL (ну или почти SQL) базу данных PostgreSQL и NoSQL базу данных MongoDB. И понять, для каких проектов лучше подойдет реляционная PostgreSQL, а для каких MongoDB.
Данное сравнение также важно, потому что, учитывая новый функционал, MongoDB стала обладать некоторыми качествами SQL СУБД, включая многодокументные ACID-транзакции, вторичный индекс и расширенные возможности запросов. А PostgreSQL расширяет возможности работы с JSON, включаяиндексирование и оптимизацию запросов.
Принципиальные отличия архитектуры
Начнем с того, чем концептуально отличается PostgreSQL от MongoDB.
PostgreSQL - это реляционная база данных, где данные представлены таблицами со связями по ключам. Графически это можно представить следующим образом.
![Пример таблиц и связей в реляционной базе данных Пример таблиц и связей в реляционной базе данных](https://habrastorage.org/getpro/habr/upload_files/17a/aeb/6b5/17aaeb6b581babc85c2ce3e146cb35df.png)
MongoDB - это документо-ориентированная NoSQL база данных. MongoDB работает с коллекциями документов и самими документами. Схематически это можно представить следующим образом:
![Хранение данных в документо-ориентированной СУБД Хранение данных в документо-ориентированной СУБД](https://habrastorage.org/getpro/habr/upload_files/3c9/c7d/396/3c9c7d396e6d0abaddc5ddfb80492f91.png)
Данные архитектурные отличия являются первопричиной функциональных и качественных различий PostgreSQL и MongoDB.
Качественное различие №1 - масштабируемость
PostgreSQL хорошо масштабируется вертикально, но в концепции “ванильной” версии создание кластеров не предусмотрено. Хотя есть реализации с созданием кластеров PostgreSQL, это нетривиальная задача, сопряженная с рядом сложностей и требующая специализированных навыков. Кроме того, кластеры реляционных баз масштабируются только до определенного предела. Вдобавок, одна таблица в PostgreSQL не может занимать более 32 Тб, а одна запись - не более 1,6 Тб.
Что касается MongoDB, то возможность легкого горизонтального масштабирования уже заложена в ее архитектуру, хотя и имеет определенные ограничения для начального сегментирования (32 Тб на одну коллекцию).
Качественное различие №2 - ACID-транзакции
Небольшое напоминание про ACID.
ACID транзакции - это такие транзакции, которые гарантируют атомарность, согласованность, изоляцию и устойчивость. Атомарность гарантирует, что никакая транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной. Согласованность гарантирует, что каждая успешная транзакция по определению фиксирует только допустимые результаты. Изолированность гарантирует, что во время выполнения транзакции параллельные транзакции не окажут влияния на её результат. А устойчивость гарантирует сохранность внесенных изменений вне зависимости от внешних факторов.
PostgreSQL изначально разрабатывался так, чтобы поддерживать высокий уровень соответствия принципам AСID.
В MongoDB официальная поддержка AСID появилась с версии v4 в 2018 году.
Атомарные модификаторы в MongoDB могут работать только с одним документом, что не дает гарантии при транзакциях с несколькими коллекциями (таблицами).
Также по умолчанию MongoDB не сохраняет ваши изменения на диск сразу. Таким образом, есть вероятность следующей ситуации: статус обновления - “выполнено успешно”, но при условном отключении питания данное обновление будет потеряно.MongoDB предоставляет параметры для управления уровнем «долговечности» обновлений. СУБД может дождаться, пока другие реплики получат это обновление (в памяти), дождаться записи в локальный файл журнала и т. д.
Помимо этого, в MongoDB нет простых «атомарных» обновлений нескольких коллекций и даже нескольких документов в одной коллекции. Это можно решить с помощью двухфазной фиксации или реструктуризации вашей схемы, чтобы обновления выполнялись в одном документе.
Таким образом MongoDB имеет:
атомарность на уровне документа (хотя с версии v4 атомарность расширена и на коллекции, но с рядом ограничений), что не вполне соответствует полной атомарности,
окончательную, а не моментальную согласованность, что гарантирует согласованность только через определенное время, не гарантирует полную изоляцию и обеспечивает меньшую устойчивость в сравнении с PostgreSQL.
В большинстве случаев вы не заметите принципиальной разницы, но если требования AСID для вас критичны (вы банк и сумма должна сходиться “копейка в копейку” вне зависимости от внешних факторов и режимов эксплуатации), предпочтительнее будет использовать СУБД изначально адаптированную под транзакционные нагрузки, такую как PostgreSQL.
Качественное различие №3 - организация хранения данных
PostgreSQL подразумевает, что вы знаете точную схему таблиц, ключей, и что и где хранится. MongoDB дает существенно большую гибкость, так как по своей сути вы работаете просто с наборами документов и их коллекциями, что организационно проще, снижает порог входа, имеет более простую кривую обучения и позволяет проще вносить изменения при смене бизнес-требований.
Функциональные отличия MongoDB от PostgreSQL
№1 Работа с JSON
Как MongoDB, так и PostgreSQL умеют обрабатывать JSON. MongoDB хранит JSON, используя собственный формат BSON , а Postgres формат JSONB.
MongoDB обладает двумя преимуществами:
Встроенным валидатором схемы.
Интеграцией с экосистемой Node.js, что упрощает использование при разработке на Node.
№2 Производительность
MongoDB обычно работает быстрее в том случае, если в операции задействованы различные объекты. Это связано с тем, что данные денормализованы и не требуют дорогостоящих соединений между таблицами.
Postgres лучше справляется со сложными запросами благодаря SQL и встроенному оптимизатору запросов.
Лицензии и тренды развития
PostgreSQL распространяется под открытой либеральной лицензией, аналогичной MIT и BSD лицензии. Помимо этого PostgreSQL имеет очень активное сообщество и развитую экосистему, что позволяет продукту активно развиваться и расширять долю рынка.
MongoDB распространяется по лицензии, которую нельзя назвать Open Source (она скорее проприетарная и близка к AGPL v3). Данная лицензия накладывает мало ограничений для персонального использования, но не позволяет использовать MongoDB как лицензируемую часть коммерческих решений, создавать конкурентные решения и предоставлять managed сервисы.
Сравнение PostgreSQL vs MongoDB
PostgreSQL | MongoDB | Вывод | |
Вид базы данных | Реляционная | Документо-ориентированная | Вид баз данных определяет лучшие сценарии использования. PostgreSQL лучше подходит для транзакционных нагрузок, а MongoDB для работы с большим количеством документов |
Лицензия | Аналогичная MIT и BSD лицензии | Проприетарная, близкая к AGPL v3 | PostgreSQL распространяется по более либеральной лицензии |
Масштабируемость | Хорошая вертикальная масштабируемость, ограниченная горизонтальная | Высокая горизонтальная масштабируемость | Обе базы обладают возможностями масштабирования, но горизонтальная масштабируемость MongoDB лучше |
ACID - транзакции | Поддерживаются | Поддерживаются, но с рядом существенных ограничений | Обе СУБД поддерживают AСID-транзакции, но MongoDB обладает рядом ограничений, не позволяющих однозначно соответствовать ASID. |
Организация хранения данных | В таблицах, со связями по ключам | В виде документов с разбивкой по коллекциям | PostgreSQL лучше подходит для транзакционных нагрузок, а MongoDB для хранения большого объема документов |
Работа с JSON | Поддерживается в формате JSONB | Поддерживается в формате BSON | Поддерживается обеими базами данных, но поддержка MongoDB включает более широкий функционал |
Производительность | Лучше справляется со сложными запросами благодаря SQL и встроенному оптимизатору запросов | Работает быстрее если в операции задействованы различные объекты | Для разных типов использования производительность различается. Если у вас присутствуют сложные запросы, целесообразно выбрать PostgreSQL |
Порог входа и гибкость использования | Имеет средний порог входа, невысокую гибкость (возможность быстрых изменений) и среднюю по сложности кривую обучения | Имеет низкий порог входа, простую кривую обучения и высокую гибкость при использовании | MongoDB обладает более низким порогом входа, криво обучения и более высокой адаптивностью при использовании |
В статье мы сравнили две совершенно разный СУБД - PostgreSQL и MongoDB. Если вам нужна транзакционная база данных, сложный SQL-запросы и высокое соответствие ACID, лучше выбрать PostgreSQL. Если требуется эластично хранить большие объемы данных, минимально задумываться о схеме и гибко подходить к изменениям, целесообразно выбрать MongoDB. Но часто в промышленных проектах эти базы данных комбинируются так, чтобы использовать сильные стороны каждой из данных СУБД.
Вы можете развернуть базы данных PostgreSQL и MongoDB в облаке Amvera Cloud c помощью push в выделенный Git-репозиторий. Для хостинга баз данных PostgreSQL и MongoDB нужно выполнить несколько простых шагов, описанных в инструкциях для PostgreSQL и MongoDB соответственно. Стоимость хостинга СУБД начинается от 170 руб. в месяц с поминутной тарификацией. Для теста системы вы можете использовать код QCOWI100, который добавит немного баланса для проведения экспериментов без необходимости предварительной оплаты.