Андрей
Диёр
нет не часто, если по уму
Ну вот как в монге какой-нибудь правовой документ или научную статью хранить, если там повсюду ссылки на другие статьи
Диёр
Вообще каждое слово на что-нибудь ссылается
Диёр
И на него ссылаются
Андрей
Диёр
Диёр
Андрей
всеравно случай вики не так уж и част кмк, не встречал ни разу
Vladimir
я тоже замечал, что почти всегда документы должны друг на друга ссылаться по бизнес логике. А если вдруг такой кейс что нет, так и вообще можно по базе на тип документа держать тогда
Roman
нет не часто, если по уму
Часто или не часто, а без этого никак. Ни один домен не ложится на 100% на полную денормализацию.
Shub
вы упускаете из виду пару важных моментов технического характера
Shub
во-первых, 99% кодерков не могут в документ-ориентированный дизайн и поэтому все аппликации на монге очень быстро упираются в проблему отсутствия транзакций, точнее, даже не транзакций, а атомарной записи в несколько документов
Anonymous
Диёр
Shub
я бы сказал что в большинстве юзкейсов с монгой как с основным хранилищем кромешный ад начинается именно тут
Anonymous
Чем чревато отсутствие транзакций я понимаю. Но причем тут документоориентированночть?
Shub
потому что упомянутые 99% дизайнят по принципу "документ == таблица"
Shub
ну с поправкой, что есть тип данных "структура", которого нет в стандартном скуэле
Shub
то есть они дизайнят будто это postgres + jsonb
Anonymous
А надо?
Shub
что надо?
Anonymous
А как надо дизайнить?
Shub
в смысле. как надо?
Shub
ну как минимум считать, что документ - это aggreggate root, со всеми вытекающими
Anonymous
Shub
ну обычно дизайнят что-то типа "документ Юзер ссылается на документы ЮзерТекст\ЮзерАватар\ЮзерХХХ". то есть есть n (n >= 2) документов, между которыми требуется консистентность.
Shub
монга не позволяет писать в оба документа с гарантией атомарности
Shub
бай дизайн.
Shub
монга часто не позволяет писать в один документ с гарантией атомарности или дурабилити, но это не бай дизайн, это просто там багов миллион
Anonymous
Так их достаточно слить воедино и будет атомарно же.
Anonymous
В этом же смысл Монги не?
Shub
в общем, это проблема номер раз. последствия этой проблемы - доморощенные "грязные" транзакции, которые часто не работают
Anonymous
Диёр
а у меня на старом проекте один из фронтендщиков говорил что надо постгрю выкидывать и брать монгу потому что жсон закинул и збс
Shub
проблема номер два - агреггатные запросы в монге (аналоги GROUP BY) требуют отдельного инженера на фултайм
Shub
потому что внезапно для этого требуется писать мап-редьюс джобы, а они ни в одном клиенте толком не поддерживаются. монга предлагает херачить туда жсон хранимки вербатим
Диёр
сколько проблем от этой монги
Shub
Shub
и если он даже сумеет проблеять что-то вразумительное, поинтересуйся, кто будет писать эту тонну кода, чтобы адаптировать текущий дизайн, базирующийся на реляционке? ну и заодно какие будут гарантии консистентности этой всей темы?
Shub
если речь про вспомогательные вещи, типа "давайте запилим кэш на монге" - то это пожалуйста, монга для этого хороша, даже синхронная версия очень быстрая
Shub
а в остальном я нахожу свое, особенное удовольствие - задавать уточняющие вопросы
Диёр
не, в его представлении постгря или монго это чисто хранилище данных и вся их разница в том что на постгресе надо скулем пользоваться и описывать таблицы и связи, а в монге жсоноподобное закидывать
Shub
типа, ну у нас же микросервисы, да? как там с попыткой одновременного доступа к документу дела?
Shub
Диёр
для меня тема констрейнтов в монге всё ещё не раскрыта
Диёр
все варианты которые я находил это всё к херам лочить и ручками проверять
Shub
для меня концептуальная целостность монги все еще открытый вопрос
Shub
а если говорить про ее имплементацию - то монга вопрос закрытый. это не бд, это hey save me maybe
Shub
https://aphyr.com/posts/284-call-me-maybe-mongodb
Shub
помимо того, что говорит афир - почитайте еще и комменты, там просто жир
Диёр
есть ещё datomic - не знаю что это такое, но в кложур все на него фапают
Диёр
Диёр
Anonymous
Диёр
ну я про конкретный кейс с тем фронтендщиком
Anonymous
А.
Anonymous
Я думал ты про мой вопрос о транзакционности.
Диёр
ну тот типчик в принципе странный был: "ну зачем все эти типы, тесты, можно же просто сразу четенько писать код без ошибок"
Anonymous
Диёр
ну опять таки явно не наш кейс был, там довольно сложный гуй был какой-то
Ilya
Shub
Ilya
Что ж...
Андрей
какие бы ни были быстрые джойны в постгре итд. иногда (иногда), да почти всегда, лучше когда их не надо.
- jsonb в постгре, это нетипизированная хрень еще хуже чем bson,
- запросы по ним не менее страшненькие чем монговские, там хотя бы как все остальное
- настроить репликацию в постгре, итд вразы сложнее чем добавить ноду в монге, лучше уж сразу couchdb, вот где вам нужен будет инженер на фултайм
несмотря на это постгря - лучшая реляционная база, была, есть и долго еще будет
Roman
какие бы ни были быстрые джойны в постгре итд. иногда (иногда), да почти всегда, лучше когда их не надо.
- jsonb в постгре, это нетипизированная хрень еще хуже чем bson,
- запросы по ним не менее страшненькие чем монговские, там хотя бы как все остальное
- настроить репликацию в постгре, итд вразы сложнее чем добавить ноду в монге, лучше уж сразу couchdb, вот где вам нужен будет инженер на фултайм
несмотря на это постгря - лучшая реляционная база, была, есть и долго еще будет
Эмм, а как это bson более типизированный, чем jsonb?
Андрей
больше типов - более типизированный. Например есть int32, int64, double и decimal128. Ещё сам формат оптимирован для быстрого поиска объектов и полей внутри
Roman
В постгре тоже отдельный механизм индексирования jsonb. И поиск там шустрый. Насчёт numeric типов не знаю ситуацию
Диёр
Ъуъ
Диёр
По качеству, например, hello world принимающий 1000 http запрос на node.js 8-10мб оперативной и 1-но ядно, на java это 300-500мб(только на старт) и все 8 ядер не хватет на обработку. при этом на node рост памяти до ~100мб.
Диёр
Это что надо сделать чтобы 8 ядер не хватало на такое
Ayrat
ОХ ЕБАТЬ КАКАЯ СКАЛА ТУПАЯ ПИЗДА
Ayrat
вот такой жсон
{
“value”: 1
}
где валуе может быть, а может не быть и вообще оно Double
при таком классе:
case class Foo(value: Option[Double])
она парсит в (ВНИМАНИЕ)
Foo(value = Some(1)), где 1 - это ИНТЕЖЕР в рантайме
Ayrat
потому что ебаное стирание типов
Ayrat
НУ ПИЗДЕЦ
Sergey