LINUX.ORG.RU

ORM vs SQL

 ,


0

3

Регулярно читаю на форумах (в том числе и тут подобное встречаю), что ORM юзать не надо, что это оверхед, что Go без ORM отлично живёт, Gorm не нужен - и так про любой язык программирования.

Понятно, что если не использовать ORM, то производительность приложения будет, скорее всего, повыше, и понятно, что ORM обычно накладывает определённые ограничения.

Но приведу пример. У меня есть API-эндпоинт, возвращающий список некоторых сущностей. Там есть вариантов сортировки штук 10, штук 20-30 вариантов опциональной фильтрации и пагинация. Причём для некоторых вариантов фильтрации нужно делать дополнительные JOIN или подзапросы. Я это реализовал через Doctrine DBAL - и получилось довольно удобно и вполне читабельно. Генерируемый SQL-запрос оптимальный и вполне шустро работает.

Но вот чего понять не могу, неужели вы (при разработке без ORM и квери-билдеров) руками конкатенируете строку запроса? Если да, то как вы потом эту адскую лапшу кода разбираете и как контролируете, чтобы запрос не получился невалидным (где-то пробел забыли и т.п.)?

Хотелось бы услышать противников использования ORM и квери билдеров, как вы решаете такие задачи? И на что маппите результаты запросов? На обычные массивы, не на объекты?

Ответ на: комментарий от anonymous

Но… я не помню чтоб где-то рассказывалось как постгрис подготовить быть репликой на горячую. Ведь перед отправкой изменений в новую реплику она уже должна быть синхронизирована. По-моему это очень сложно проделать

Добавляешь асинхронную реплику, потом апгрейдишь до синхронной через synchronous_standby_names в конфиге и грузишь конфиг (pg_ctl reload). Другое дело, что при падении мастера запросы «сами» не пойдут на запасной сервер — кто-то должен их туда перенаправить.

Если взять какую-нибудь модную БД, та же mongodb, она умеет синхронизировать инстансы самостоятельно, с ней управлять синхронной репликой будет наверно значительно проще

Может и проще. Но основное преимуещство ее далеко не в этом, а в возможности шардирования, которая недостижима для всех SQL СУБД.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

pg_ctl

Другое дело, что при падении мастера запросы «сами» не пойдут на запасной сервер — кто-то должен их туда перенаправить.

Свежий постгрес уже умеет и сам. См. https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING Пункт «33.1.1.3. Specifying Multiple Hosts»

anonymous
()
Ответ на: комментарий от anonymous

Свежий постгрес уже умеет и сам. См. https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING Пункт «33.1.1.3. Specifying Multiple Hosts»

И правда, с десятки такую штуку он умеет. Правда, клиент будет сначала через мастер по таймауту проходить.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

В 2020 году на бэкэнд (не фулстэк) отправляют самых бездарных разрабов.

С разморозкой! Это происходит с начала времён. Ты посмотри на весь этот похапе-треш, кто его писал как считаешь? Там даже не макаки, а низшие приматы. Или подумай почему появился CGI/FastCGI, это же убого до невозможности. А все ради одноклеточных на бэкенде. И сейчас похапе в разнвх вариациях все никак не сдохнет, хотя есть все возможности делать хорошо на нормальных ЯП.

anonymous
()
Ответ на: комментарий от anonymous

А чего нет C?) Ты писал какой-нибудь веб-сервис на чём-то из этого? Если нет, то попробуй, а потом расскажи.

dimuska139 ★★
() автор топика
Ответ на: комментарий от anonymous

C++, rust, scala

Все-таки соглашусь с соседним оратором по поводу крестов и раста. Даже яндекс и гугль не пишет на крестах без необходимости. А вот скала — это вполне себе годное решение для сервера. Clojure еще из этой обоймы можно вспомнить.

byko3y ★★★★
()
Ответ на: комментарий от dimuska139

Да, писали социалочки на C++ когда еще не было фейсбуков. Там были чаты, форумы, личка, игры. Всё как у макак, только работало быстро и держало тысячи юзеров на допотопном железе. Продавалось неплохо.

anonymous
()
Ответ на: комментарий от anonymous

Да, писали социалочки на C++ когда еще не было фейсбуков. Там были чаты, форумы, личка, игры. Всё как у макак, только работало быстро и держало тысячи юзеров на допотопном железе. Продавалось неплохо

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

byko3y ★★★★
()
Ответ на: комментарий от anonymous

Скорость разработки по сравнению с тем же php/python низкая, а руки должны быть крайне прямыми, чтобы приложение не текло. Тем более что многие вещи придётся в итоге наверняка писать руками, т.к. едва ли для веба там столько библиотек, сколько для php/python. Знаю контору, которая по этой причине (и не только) олдскульные проекты с крестов на Go перенесла, а часть сервисов в итоге на Php перевела. Что за контора не столь важно, но в странах СНГ не совсем прямо неизвестная.

Насчет Scala ничего не скажу (не имел дела), но кресты… раст… На крестах, мне кажется, сейчас есть смысл пилить ноды, где нагрузка уж совсем огромная, как в VK, Facebook. Причем именно для CPU-bound задач.

dimuska139 ★★
() автор топика
Ответ на: комментарий от WitcherGeralt

… оверхед — миф. Обычно он незначительный.

Тут многие так писали. А я давно хотел спросить (и боялся :) ).

Почему в бенчах techempower.com (на этот сайт ссылается автор fastapi на своём гитхабе) full orm обычно сильно тормозит по сравнению с raw? Вот несколько результатов оттуда (url давать бессмысленно, он не работает между сессиями, надо мышой тыкать). Когда были варианты, старался брать те, в которых всё остальное одинаковое (иногда брал микро орм, когда не было фул).

ORM: full vs. raw, 1000 req/s
framework full raw
actix 28 45
aiohttp 2.3 12
aspcore 1.8 3.2
bottle 1.2 8.2
composure 2.3 11.3
flask 1.6 7.0
kitura 4.0 4.8
http-kit 6.4 16
nodejs 4.1 10.6
php 4.7 17.6

(django, sinatra, spring – нет, т.к. нет результатов raw. пробежался глазами по всем фрэймворкам, неудобные данные не скипал.)

Кое-где фул орм уступает мало, кое-где сливает во много раз.

the1 ★★
()
Последнее исправление: the1 (всего исправлений: 1)
Ответ на: комментарий от the1

Ничего удивительного. ORM это 100 слоев говнокода на «скриптухе», а сырые запросы исполняются через очень тонкую прослойку. Эти тесты больше показывают какой оверхед добавляют пыхопитоны, а не сам ORM. Ну и ненастроенный ORM может терроризировать базу шквалом запросов на каждый чих. Если это все синхронно выполняется, то будет жопа.

bread
()
Ответ на: комментарий от dimuska139

Скорость разработки по сравнению с тем же php/python низкая

«Скорость разработки» от языка не зависит.

едва ли для веба там столько библиотек, сколько для php/python

А вот это главный фактор, да.

anonymous
()
Ответ на: комментарий от bread

Ничего удивительного. ORM это 100 слоев говнокода…

Витчер, bread назвал тебя жёлтым земляным червяком! :)

…показывают какой оверхед добавляют пыхопитоны

Если это все синхронно выполняется…

Эти два параметра (язык-фрэймворк и синхронность) фиксированы для каждой приведённой мной строчки. Отличие только в орме.

ненастроенный ORM может терроризировать…

Ну я написал: ресурс респектабельный (гитхаб фастапи).

the1 ★★
()
Ответ на: комментарий от the1

Потому, что подобные бенчмарки слишком сферические и не слишком сильно пересекаются с реальностью.

Во-первых, код формирования запроса у тебя никогда не будет сам по себе, вокруг будет простынка бизнес-логики, за авторизацией нужно будет куда-то сходить, мб ещё и какие ресурсы получить, конфиг, например. Во-вторых, сам запрос в БД далеко не нулевое время будет занимать, как минимум потому что сеть. В третьих, ты всё равно будешь как-то изголяться, чтобы код получился почитаемей да поуниверсальней, например, в случае получения выборки каких-то сущностной из таблицы с парой десятков колонок, и не факт, что сильно лучше чем с ORM получится.

Понятно, что оверхед есть, но где-то он может быть и замнетен, а где-то будет в рамках погрешности.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

слишком сферические и не слишком сильно пересекаются с реальностью.

Там в конце колонка implementation approach, там всюду realistic :)

… простынка бизнес-логики, за авторизацией …. какие ресурсы …

сеть

изголяться, чтобы код получился почитаемей

Вот совершенно не понял ничего. При чём тут это всё?

Есть некий код, с орм. Начхать что в твоём проекте он станет сферическим. Ну правда же, для целей теста orm vs. raw – начхать! Его модифицировали для raw. Замерили разницу. Она обычно огромна. Почему?

the1 ★★
()
Ответ на: комментарий от the1

Ты сравниваешь в лучшем случае 1/20 часть того что есть в веб-приложениях. Это бессмысленно, полноценном беке эти различия практически нивелируются.

Почему?

Потому что код, которого нет, априори быстрее того, что есть.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

полноценном беке

Но ведь правильно сравнивать оверхед орма с базой (+ минимальная обвязка в беке), а не со «всем остальным», «реалистичным».

Это как если сказать, ну нормально что терминал выжирает гиг (условно) оперативы, потому что в реальной жизни браузер выжирает 5.

Т.е. орм – это реальный тормоз по сравнению с базой, так? Здесь ты согласен?

PS.

Я просто заинтересовался одно время, затестил свой вэб-апп, потом бросил это дело. Потому что я нуб, и надо разбираться. Но вот специалисты, они знают своё дело. И я в растерянности.

the1 ★★
()
Последнее исправление: the1 (всего исправлений: 2)
Ответ на: комментарий от the1

правильно

Не правильно, а бессмысленно.

Здесь ты согласен?

Не согласен. Нет никакого толку замерять кто из нас с тобой быстрее встаёт с дивана, если соревноваться мы будем в триатлоне.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Когда настанет время триатлона, будем замерять лыжи-стрельбу (и что-то ещё). А сейчас мы рассматриваем вставания с дивана, и тестируем разные бронежилеты.

PS. Ладно. Не понял, но спасибо. Может ещё кто прокомментирует.

the1 ★★
()
Последнее исправление: the1 (всего исправлений: 1)
Ответ на: комментарий от the1

Да просто найдется еще много способов затормозить бэкенд кроме орма. Вот о чем речь. Конечно, всегда желательно минимизировать количество кода на скриптовом языке, а ORM это жирный такой кусок. Хуже того, он очень много объектов генерит, а это сказывается на работе GC. Весь этот комфорт (по-моему сомнительный) дорого стоит, об этом стоит помнить.

anonymous
()
Ответ на: комментарий от WitcherGeralt

Ну я наивно отвечу, потому что не понял иронии (если она тут есть). У меня будет (надеюсь; не скоро) мой маленький вэб-сайтик. Он будет самописный, и простенький. Будет в 5-10 раз больше запросов обрабатывать :)

the1 ★★
()
Ответ на: комментарий от the1

А будет ли у тебя столько запросов, чтобы их обрабатывать-то?

Нормально написанный бек с ORM столько обработает, сколько ты юзеров никогда нагнать не сможешь. Я бы тебе с удовольствием показал, если бы мог, какие конские объёмы данных (событий, у меня не веб) можно обрабатывать даже на ноутбучном проце, и ORM этому ни капли не мешает.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от the1

Может ещё кто прокомментирует.

Экономия на спичках формально тоже что-то экономит и имеет некие аргументы, но…

goingUp ★★★★★
()

ORM - нет, SQL - да!

Фёдор.

anonymous
()
Ответ на: комментарий от the1

Я тоже так когда-то думал, а по факту на моём сайте больше 400 человек в день никогда не было. Сделать сайтик, который будет уйму запросов обрабатывать гораздо проще, чем эти запросы к нему получить.

dimuska139 ★★
() автор топика
Ответ на: комментарий от WitcherGeralt

сколько ты юзеров никогда нагнать не сможешь.

@dimuska139:

Сделать сайтик, который будет уйму запросов обрабатывать гораздо проще, чем эти запросы к нему получить.

Тут согласен :) Я прикидывал это, давно уже (выше дал ссылку на свою тему). Перевёл риквесты в заказы (оценил мой бизнес-кейс), получалось 1$ в секунду :)

Но неприятно ж ведь! Если всё (фрэймворк-обвязка-и т.п) убыстрилось в 5 раз, то по сравнению с базой орм съедает в 50 (условно; может 20) раз больше базы. Ну бред же :)

@goingUp:

Экономия на спичках….

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

the1 ★★
()
Ответ на: комментарий от the1

Я считаю, что для сайтов аля морда к БД в одно рыло без сложной бизнес-логики ORM мягко говоря не нужен. Даже если бы там не было оверхеда, это резко все усложняет. Вместо написания запросов в лоб и форматирования результатов начинается архитектурная дрочь с ОО-паттернами и бесконечным рефакторингом. Сначала может казаться «ах как все красиво и легко». А потом зароешься в свалке взаимозависимых классов, и уже будет гораздо меньше фана. Я много повидал этих ормов во времена хайпа рельсов, так вот те проекты всегда кончали раком. Но если нужно херак-херак еще вчера, а завтра свалить, то орм может быть единственным вариантом.

bread
()
Ответ на: комментарий от the1

Ты лично знаешь этих спецов? Ты видел их код? Они в известных проектах работают? Не верь всему, что тебе пишут. По переписке на ЛОРе далеко не всегда можно точно определить то, насколько человек компетентен и вообще адекватен ли. Может это вообще джун зелёный, который сюда покудахтать заскочил. А, может быть, и наоборот - неизвестно.

Рассуди сам: если у тебя на ORM уходит, скажем, аж 30 мс (по факту гораздо меньше), а сам SQL-запрос выполняется 200 мс, а ещё 100 мс уходит на сетевые издержки, то есть ли какая-то разница в случае если ты уберёшь ORM? Ну будет у тебя не 330 мс, а 300 всё это выполняться - это разве ощутимая разница? И это случай, когда у тебя не используется кеш (обычно данные будут из кеша доставаться всё равно).

Жир ORMа очень сильно преувеличен. Настолько, что в 90% случаев ORM узким горлышком не является. В случае проблем с производительностью дело обычно не в использовании ORM, а в кривых руках. Где-то индексы в базе не сделали, где-то вместо 5 столбцов, которые используются, тянут из таблицы БД вообще все столбцы, где-то запросы циклом лепят и т.п. Я ни разу нигде не сталкивался с тем, чтобы эндпоинт работал медленно из-за того, что используется ORM. А если уж и столкнулся с таким, то все ORM позволяют при желании сделать запрос на чистом SQL.

dimuska139 ★★
() автор топика
Последнее исправление: dimuska139 (всего исправлений: 1)
Ответ на: комментарий от bread

Но если нужно херак-херак еще вчера, а завтра свалить, то орм может быть единственным вариантом

Не знаю не знаю) Не раз сталкивался с другим. Когда разраб напишет уйму говнокода, который формирует строку запроса, а потом проект вообще поддерживать невозможно, особенно если решили с MySQL эту парашу на PostgreSQL перетащить. Потому что если запрос состоит из кучи опциональных условий и сортировок, то пилить функцию с кучей if-аков, которые абы как эту строку запроса собирают - говнокод. Это невозможно сделать красиво и читабельно. А попытка привести это в порядок превращается в попытку сделать собственную ORM.

Я не топлю за использование ORM, но хотя бы квери-билдер по-любому нужен.

dimuska139 ★★
() автор топика
Ответ на: комментарий от dimuska139

Ну в общем, надо будет потом запрофилировать-замерить всё. Обсуждать чужие тесты (и юз-кейсы) немножко глупо. Когда-если будут предметные вопросы – создам тему.

Даже если скорости достаточно :) Вот бесит меня такое :) Я емакс когда-то удалил (после 10 лет использования, даже и под виндой) ровно из-за того что он 100 метров (или 200, не помню) винча занимал. Место есть. Просто бесит такое :)

Спасибо всем!

the1 ★★
()
Последнее исправление: the1 (всего исправлений: 1)
Ответ на: комментарий от dimuska139

Понятно, что наговнокодить можно всегда. Но чем более прямолинейно решение, тем проще разобраться на самом деле. Даже если там некрасивая лапша.

bread
()
Ответ на: комментарий от bread

Тупой ты лошок. И проекты твои не на рельсах, а на шпалах. Ниже тебе всё правильно написали: если руки без знаний то пофиг, на SQL ты корябаешь или с помощью ORM.

А потом зароешься в свалке взаимозависимых классов

Ваще в шоке. Для таких упоротых придумали DI.

anonymous
()
Ответ на: комментарий от the1

Я емакс когда-то удалил ровно из-за того что он 100 метров

Тяжело быть вами во вселенной, где node_modules может распухнуть на гигабайт. Веб сейчас это самый жирный жир, жирнее не бывает.

bread
()
Ответ на: комментарий от anonymous

Для таких упоротых придумали DI.

Вот, начинается. Быстрый анон, уже расчехлил прибор и начал подрачивать.

bread
()
Последнее исправление: bread (всего исправлений: 1)
24 августа 2021 г.
Ответ на: комментарий от Legioner

Позвольте у вас спросить, вы клеите запросы в т.ч. update/insert строками плюс инструментами psycopg2.sql.SQL? Перекладываете в объекты и обратно тоже вручную?

anonymous
()

Орм и квери-билдеры как бе разные вещи

nikolnik ★★★
()
Ответ на: комментарий от Legioner

Имел в виду вещи типа psycopg2.sql.SQL(',').join(map(psycopg2.sql.Identifier, my_dict.keys())) и затем insert into jobs ({}) values (.... Но я вас понял. А дальше вы наполняете/разбираете руками объекты или в словарях оставляете?

anonymous
()
Ответ на: комментарий от anonymous

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

Legioner ★★★★★
()
Ответ на: комментарий от dimuska139

Вот. ORM кроме всего прочего содержит еще слой абстракции «хранилище», который реализует и диалект SQL. Поменялась версия постгриса, подправили пару строк в орм, не надо бегать по всему проекту.

level1 ★★
()
Ответ на: комментарий от byko3y

фундаментально нерасширяемо, некомпонуемо, а значит — не нужно

Здравствуйте, это опять тред про ООП? %)

Nervous ★★★★★
()
Ответ на: комментарий от level1

В идеале - да. Но даже и без этого если проект нормально приёмочными тестами покрыт, то смена версии PostgreSQL делается достаточно безболезненно.

dimuska139 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.