Как стать автором
Обновить

Комментарии 22

Конечно, сравнение MongoDB и PostgreSQL, это как удава в попугаях измерять. Сильно уж разные СУБД для разных задач. Но как совсем база для начала изучения - может быть.

Это связано с тем, что данные денормализованы и не требуют дорогостоящих соединений между таблицами. 

Денормализация денормализации рознь.
Есть кейсы, когда нормализация наоборот ускоряет манипуляции с данными.

Для монги главный фактор для использования: требуется дешевое горизонтальное масштабирование. Во всех остальных случаях: стоит подумать нужна ли реально монга, потому что потом будет больно с нее съезжать, т.к. честный ACID снимает кучу головняков, не только для "денежных" сервисов.

Одно из самых важных отличий -- простота обеспечения отказоустойчивости и шардирования. В MongoDB поддержка нескольких узлов есть "из коробки", а PostgreSQL же в этом плане -- конструктор "собери сам", вот вам встроенная поддержка репликации на основе WAL, а дальше сами.
Пулинг соединений, балансировка, failover, шардирование, логическая или физическая репликация -- всё выбери сам, настрой сам и борись с багами в сторонних утилитах тоже сам =)

Минус есть, ответа нет. С чем не согласен минусующий? С важностью отличия или с тем что у PostgreSQL нет в стандартной поставке готового механизма шардинга и обеспечения отказоустойчивости?

У нас, если что, в эксплуатации и MongoDB есть и PostgreSQL, причём больше 10 лет и то и другое.

В MongoDB официальная поддержка AСID появилась с версии v4 в 2018 году. 

То ест до 4 версии, MongoDB не могла называться СУБД.

Атомарные модификаторы в MongoDB могут работать только с одним документом

А с 4 версии, она стала СУБД только на пол шишечки.

Я знаю что хейтить MongoDB модно (особенно тем, кто про неё читал в интернете "она теряет данные"), но её вполне можно было использовать примерно с версии 1.8.

А вы точно знаете, чем субд отличается от просто файлика на диске?

А вы как собираетесь оценивать точность моего знания? По тому, совпадает ли оно с вашим или нет? Беспроигрышный вариант! То что у вас невысокое мнение о MongoDB, по той или иной причине, не говорит ничего о её качестве и "настоящести". В нашем проекте (170млн запросов от клиентов в сутки) работает нормально, в разных ролях, и как основное хранилище, и как объектное хранилище, и как in-memory кэш и сервис очередей. Могла бы быть побыстрее в некоторых сценариях, ну тут уж куда деваться, что есть то есть.

А если ответить на ваш вопрос нейтрально, то всё зависит от требований. Даже "файлик на диске" может быть частью СУБД, на SQLite можете посмотреть например или на BerkeleyDB.

Я вам по секрету скажу: все СУБД хранят БД в виде файликов на диске.

Благодарю за предоставленную вами информацию =)

У вас видимо чисто интернете представление об этой СУБД, работаю с ней около 7 лет, с удовольствием ставлю в различные проекты, и могу сказать, что это просто прекрасное программное решение, которое помогает покрывать и автоматизировать многие вещи. Добавленная в эту СУБД validation schema дает все те же возможности для нормального хранения данных. Интеграции, например mongodb + kafka, спокойно отправляют всякие редисы и кролики отдыхать. Для проектов с поддержкой gql это вообще песня, так как не надо делать запросы, а можно просто ходить во view коллекции, из-за чего получается создавать нереально быстрые решения для лютейшего хайлоада. Также оч радует работа с geo.

В общем, настоятельно вам рекомендую изучить вопрос детальнее, обратиться к доке и практике, чтобы как вы выразились "на пол шишечки" понимать о чем говорите.

Делал я когда-то бенчмарки. Тут мы видим сравнение графовой субд, документной недо-субд, и реляционной субд, и для референса простое хранение данных в памяти процесса. Три кейса: создание дерева из 100К документов, выборка по родителю и выборка топ100 по дате создания. Всё прогонялось в 100 конкурентных потоках.

Ну просто нереальная скорость, да, хороший компромисс за отсутствие гарантий. А если сказать Монге не мухлевать, а сообщать об успехе только после сброса буферов, то там скорость ещё более проседает. И это была 3 Монга, без ACID. И 2 Ориент, с тормозным драйвером под ноду.

Про 32ТБ лимит у PostgreSQL - слишком толсто. Это все же ограничение на одну partition, коих можно иметь десятки тысяч для одной таблицы.

Главное достоинство MongoDB, одновременно и главный ее недостаток - горизонтальное масштабирование из коробки, ценой отсутствия транзакционной целостности между документами.

Да и для монги тоже 32Тб не предел. А про транзакции уже давно есть мультидокументные, которые в пределах узла реплики атомарны. А если надо то и на кластере можно, но ценой резкого увеличения времени выполнения запроса.

В статье же сказано

одна таблица в PostgreSQL не может занимать более 32 Тб

А это ложное утверждение, так как 32 ТБ - ограничение на один раздел, а не таблицу.

транзакции уже давно есть мультидокументные

Уже нет. Появились в 4.0, а в 4.2 их заменили распределенными транзакциями.

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

if a transaction is committed and write 1 is visible on shard A but write 2 is not yet visible on shard B, an outside read at read concern"local"can read the results of write 1 without seeing write 2

Лично у меня называть это транзакционной целостностью язык не поворачивается.

Ну read concern local это всё-таки не про транзакции, так же как и write concern, отличный от majority. Есть read concern majority, есть, если уж очень надо -- linearizable.

После чего все выгоды от шардирования теряются. Вернулись к тому, с чего начали. "Вам горизонтальное масштабирование или транзакционной целостность?"

Товарищ Брюер что-то знал, когда постулировал CAP-гипотезу (теоремой всё-таки называть не стану). Но если почитать про Spanner того же Брюера, то не всё так однозначно =)

Главный минус MongoDB по сравнению с PostgreSQL, что в PostgreSQL можно организовать документную схему хранения, а MongoDB в реляционную БД не превратить никак.

В проектах часто применяю гибридную схему в PG, основные колонки - создаются как обычно, а разные необязательные и денормализированные данные в колонке типа jsonb. Как итог: миграшки делать надо сравнительно редко, в объекте есть большая часть связанных данных "одним запросом", и при этом при всём имеем все плюшки реляционных данных, чтобы делать сложные запросы с кучей join если потребуется.

Можно сравнить монгу с jsonb посгреса по производительности

Тут проблема в том, что в MongoDB шардирование из коробки, чего не скажешь о PostgreSQL. На одном узле PostgreSQL MongoDB, по моему опыту, всегда уделывает. При мультидокументных транзакциях - в разы. А вот уже на нескольких узлах - будет зависеть от того, как эти узлы слепили в кластер PostgreSQL.

RavenDB и бутылка рома! :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий