metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2013-04-03 01:06 am

В Советской Белоруссии SQL разжигает айседа

http://theiced.livejournal.com/238346.html
Собственно, про кобол я не знаю, на дельфи пишу уже 15 лет и никак избавится от него не могу (слишком много легаси кода), а вот про SQL я с ним не согласен.
Сам по себе SQL очень хорошо подходит для генерации отчетов. Если отчет сводится к фильтрации-сортировке-группировке множеств - идеально. С рекурсивными CTE - еще и деревья можно обрабатывать, не особо включая мозг. Всунув поверх этого минимальных размеров постобработку на какой-нибудь функциональщине, можно сделать почти любой отчет, пришедший в голову свихнувшимся на Excel выпускникам нархоза, работающим в минстате, минфине и МНС.

Но когда доходит до процедурных расширений, API между СУБД и клиентскими приложениями или каких-нибудь вещей, которые забыли вовремя добавить в стандарт - начинается полная, немыслимая жопа.
Например, проклятая тема - генерация автоинкрементных ключей и возвращение значений автоматически заполненных полей. Кто во что горазд - identity, генераторы, sequence, функции (в каждой СУБД названные по разному), returning, заебы на тему "вызывать в той же транзакции и сессии" и прочая и прочая. Про вариации на тему "вернуть поле, которое заполняется автоматически, но не является ключом/identity" лучше даже не думать.
Неудивительно, что люди при первой же возможности сбегают в ORM (которые являются уже второй производной от всего этого маразма и несут на себе его неизгладимый след).

[identity profile] metaclass.livejournal.com 2013-04-03 06:52 am (UTC)(link)
Жабу и автоматизацию в одной строке упоминать не принято :)

[identity profile] fraks-nsk.livejournal.com 2013-04-03 06:53 am (UTC)(link)
ORM - это надо в программе завести классы аналогичные тем что имеются в базе. Т.е. дублирование.
Дальнейшая работа с этими классами подразумевает что они имеют заполненные поля. А заполнятся они могут как все сразу (это неэффективно) так и по одному полю (тоже неэффективно, но уже по другому). В итоге для работы с объектами в ОРМ либо тянется куча по большей части ненужных данных либо генерится туча запросов на каждый чих.

Далее, если мы работаем с выборками по сложным запросам - тут мы или лепим в ОРМ левые классы не имеющие реального отражения в БД либо тянем коллекции классов с опять же нахрена не нужными полями.

Для того что бы работать полностью через ОРМ надо грубо говоря вытащить всю базу на клиента и распихать по объектам, что с одной стороны совершенно бессмысленно нагрузит клиента а с другой - низведет сервер до тупого хранилища. Т.е. мы проиграли с обоих сторон. Выиграли в процессе накидывания формочек, но это тоже не бесплатно и не факт что оно того стоило...

[identity profile] metaclass.livejournal.com 2013-04-03 06:54 am (UTC)(link)
Неверно.
Большинство разработчиков сторонних фреймворков неадекватны, как и любые программисты. Это не значит, что их продуктами нельзя пользоваться, но надо понимать, что там могут быть такие же залежи легаси кода и неадекватных архитектурных решений, как и в любом проекте.

[identity profile] fraks-nsk.livejournal.com 2013-04-03 06:57 am (UTC)(link)
Я смотрел SQLAlchemy и мнение об ОРМ сформировалось на этой основе.
Потом для Delphi сделали аналогичную фигню, был на форуме фанат этой штуки, типа программу накидать за пару дней можно. Но потом он столкнулся с минусами - с поддержкой, модифицированием формы объектов в базе и необходимости синхронизации изменений в ОРМ - и энтузазизм его угас, вроде даже до нуля, ибо тему ту больше никто не поднимал да и упоминания того продукта я не слышал больше. Хотя он от Борланд/Эмбаркалеро был, а не левый.

[identity profile] fraks-nsk.livejournal.com 2013-04-03 06:58 am (UTC)(link)
Не надо раскидывать логику и ничего не будет растекаться.

[identity profile] metaclass.livejournal.com 2013-04-03 06:59 am (UTC)(link)
Народ генерит базу из классов или маппингов. В первом случае класс засран по крышу аннотациями на полях, во втором - нам надо знать убогий синтаксис маппингов (в дополнение к sql и собственно ЯП)

[identity profile] fraks-nsk.livejournal.com 2013-04-03 07:00 am (UTC)(link)
>> Вы надеюсь понимаете, что в итоге пополните ряды разработчиков на COBOL?

Они до сих пор восcтребованы, как ни странно :)

>> Вы не поверите, но есть фреймворки общего назначения.

Либо они умерли и не развиваются и след. версий от них не жди либо они развиваются не в ту сторону куда вам надо. Есть счастливые исключения.

[identity profile] vp.livejournal.com 2013-04-03 07:02 am (UTC)(link)
Не, тут речь о разумности. Чтобы действительно не было, что я выбираю одну запись, а оно качает на клиента 100500 других

[identity profile] fraks-nsk.livejournal.com 2013-04-03 07:03 am (UTC)(link)
Со всем согласен, кроме того что прослойка должна писаться на ОРМ.
И вообще, толщина прослойки начинается от нуля.

[identity profile] vp.livejournal.com 2013-04-03 07:04 am (UTC)(link)
Безусловно, это не золотой костыль. Потому мозг все равно нужно включать :)

[identity profile] norguhtar.livejournal.com 2013-04-03 07:04 am (UTC)(link)
Ой да ладно.

[identity profile] theiced.livejournal.com 2013-04-03 07:06 am (UTC)(link)
есть ещё рубёвый вариант ;]

[identity profile] norguhtar.livejournal.com 2013-04-03 07:08 am (UTC)(link)

ORM - это надо в программе завести классы аналогичные тем что имеются в базе. Т.е. дублирование.
Дальнейшая работа с этими классами подразумевает что они имеют заполненные поля. А заполнятся они могут как все сразу (это неэффективно) так и по одному полю (тоже неэффективно, но уже по другому). В итоге для работы с объектами в ОРМ либо тянется куча по большей части ненужных данных либо генерится туча запросов на каждый чих.

А в формы вы не заводите и данные туда не отображаете да? Все святым духом делается? И в MVC частенько упоминаемые вами классы используются как формы. Может вы мат. часть подучите а?


Для того что бы работать полностью через ОРМ надо грубо говоря вытащить всю базу на клиента и распихать по объектам, что с одной стороны совершенно бессмысленно нагрузит клиента а с другой - низведет сервер до тупого хранилища.

Учите мат. часть. Вы мягко говоря не правы. ORM это маппинг объектов а не вытаскивание данных из базы. Вы этот маппинг делаете каждый раз когда данные селекта показываете в форме.

[identity profile] theiced.livejournal.com 2013-04-03 07:09 am (UTC)(link)
на делфи там нихуя нет а кроме делфи эта амёба нихуя не знает

[identity profile] vp.livejournal.com 2013-04-03 07:09 am (UTC)(link)
У тебя логика работы смешана с кодом ФОРМЫ на ПАСКАЛЕ!!

Щас позову Айсда, не уходи..

:)

[identity profile] norguhtar.livejournal.com 2013-04-03 07:11 am (UTC)(link)
Прям

Я лучше код пишу чем все остальные!


Надо понимать, что если я в одну харю такое решение буду делать, то убью существенно больше времени и результат будет хуже. Тупо за счет того что те люди занимаются этим больше времени чем я.

Ну а то что там могут быть черви и пауки, так это везде есть. И на стадии оценки стоит ли использовать и требуется оценить их количество.

[identity profile] thedeemon.livejournal.com 2013-04-03 07:12 am (UTC)(link)
Ruby

[identity profile] norguhtar.livejournal.com 2013-04-03 07:13 am (UTC)(link)

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

С указанными минусами вы и со своим велосипедом столкнетесь. И да SQLAlchemy не самый худший вариант, но конечно JPA и ORM который есть в yii все же лучше. Фишка в том что ORM ни в коем случае не надо тащить самому, иначе эта овчинка не стоит выделки. Разрабатывать и сопровождать ORM должны отдельные люди.

[identity profile] norguhtar.livejournal.com 2013-04-03 07:14 am (UTC)(link)

Они до сих пор восcтребованы, как ни странно :)

Их количество существенно сократилось.


Либо они умерли и не развиваются и след. версий от них не жди либо они развиваются не в ту сторону куда вам надо. Есть счастливые исключения.

Конечно конечно. К примеру Delphi

[identity profile] fraks-nsk.livejournal.com 2013-04-03 07:16 am (UTC)(link)
Если данные в объекте ОРМ не закачиваются при создании экземпляра коллекции то они вытягиваются по факту обращения к объекту или к полю объекта. Итого либо мы все тащим заранее или вырождаемся в запрос каждого поля по каждому обращению.

[identity profile] norguhtar.livejournal.com 2013-04-03 07:17 am (UTC)(link)
у делфи во время ее популярности была ровно та же проблема что у php это пропаганда говнокода. Тяп-ляп готово. А что надо еще о архитектуре думать вспоминали когда такого говна было дохуя.

[identity profile] thedeemon.livejournal.com 2013-04-03 07:17 am (UTC)(link)
пора писать 1!

[identity profile] fraks-nsk.livejournal.com 2013-04-03 07:18 am (UTC)(link)
Зови, мне не жалко.

Если логика работы используется более чем в одном месте - то я выношу это в отдельное место. Если эта форма - единственное место где у меня работа с этим объектом - нахрена мне это разделять? Что бы каноны соблюсти?

[identity profile] norguhtar.livejournal.com 2013-04-03 07:18 am (UTC)(link)
Как вы мало знаете о ORM. В ORM есть возможность сказать это взять через join и сразу.

[identity profile] fraks-nsk.livejournal.com 2013-04-03 07:20 am (UTC)(link)
>> С указанными минусами вы и со своим велосипедом столкнетесь.

Не столкнусь. У меня не ОРМ, я не работаю с объектами в программе. Все объекты только в базе, на клиенте только нужные в конкретном объеме выборки которые не претендуют на полноту данных об объекте но показывают те поля которые именно здесь нужны.

Page 4 of 15