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] norguhtar.livejournal.com 2013-04-03 06:36 am (UTC)(link)
Вот все что вы описываете и есть ORM. Разница между стандартным ORM и вашим в том что в случае подключении стороннего разработчика или передачи кода вашего проекта другому разработчику ему придется изучать ваш код для понимания логики где тут что лежит. В случае стандартного ORM ему будет достаточно почитать спецификацию. Плюс все нормальные ORM позволяют модифицировать то как они лезут в базу. И да в 90% случаев они лезут в базу как вы бы сами полезли, а кода писать приходится существенно меньше.

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

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

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

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

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

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

[identity profile] vp.livejournal.com 2013-04-03 09:32 am (UTC)(link)
Плюсую. А можно запрос, который должен был бы сделать красивый джоин превратить в сраного говно, сделать по 100 select по второй таблице.

[identity profile] norguhtar.livejournal.com 2013-04-03 09:48 am (UTC)(link)
Это из разряда как правильно отстрелить себе ногу. Плюсы в том что фиксится почти всегда легко и безболезненно.

[identity profile] fraks-nsk.livejournal.com 2013-04-03 01:39 pm (UTC)(link)
Еще кстати такой момент - все что получено на клиента - по определению устарело. Что бы знать наверняка что данные еще не протухли - надо принимать специальные меры или согласиться с тем что данные могут быть протухшими. Вытаскивание данных в ОРМ - складировать протухшую инфу или напрягать программу и сервер на отслеживание актуальности данных.

[identity profile] norguhtar.livejournal.com 2013-04-03 01:43 pm (UTC)(link)
Вы про что ORM умеет транзакции тоже не слышали да?

[identity profile] fraks-nsk.livejournal.com 2013-04-03 03:03 pm (UTC)(link)
Не слышал. Но речь не про транзакции а про то что не надо работать с данными которые по определению устарели. Надо работать с актуальными данными в базе. А если через ОРМ ухитриться так работать - то зачем оно вообще нужно? Промежуточное складирование перед показом на экране? А для чего такая трехходовка?

[identity profile] norguhtar.livejournal.com 2013-04-03 03:22 pm (UTC)(link)
Слушайте вы прикидываетесь или правда не знаете фундаментальных вещей? Когда вы сделали select из базы эти данные уже устарели, потому что это данные не в СУБД, это данные у вас на экране. Из-за этого и нужны транзакции различные уровни изоляции.

[identity profile] fraks-nsk.livejournal.com 2013-04-03 03:35 pm (UTC)(link)
Вы писатель? Это _Я_ вам пишу что все что вы получили из базы - по определению устарело. Но транзакции вам из тухнятины свежатинку никак не сделают. Они могут вам помочь получить непротиворечивое состояние временного среза данных. Они могут поймать и попытаться развести конфликт обновлений. Но без блокировки возможности изменений записи в базе вы никак не можете быть уверены что на клиенте копия этой записи не протухла. А вот блокировка может быть реализована не только с помощью транзакций.

[identity profile] norguhtar.livejournal.com 2013-04-03 03:43 pm (UTC)(link)

Это _Я_ вам пишу что все что вы получили из базы - по определению устарело.

Да ладно? это кто пишет:


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

Это вообще про что? И как? Вызывать данные в хранимке? Да та же фигня. Так же объявится транзакция и так же вы будете работать с устаревшими данными. Это суть всех РСУБД. Мы всегда работаем с данными которые потенциально устарели. Когда это критично объявляется максимальный уровень изоляции и все.


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

А зачем? Транзакция и нужна как раз для того что мы взяли данные провели манипуляции сунули в базу. ORM на устаревание данных никак не влияет.


А вот блокировка может быть реализована не только с помощью транзакций.

ДА ЛАДНО? Это как же и зачем?

[identity profile] fraks-nsk.livejournal.com 2013-04-03 03:57 pm (UTC)(link)
Это я про то что для вычислений не надо тащить данные на клиента и обрабатывать клиентом. Все что можно сделать на сервере - надо делать там.

То что вы называете максимальным уровнем изоляции - является блокировкой от изменений.

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

[identity profile] norguhtar.livejournal.com 2013-04-03 04:09 pm (UTC)(link)

Это я про то что для вычислений не надо тащить данные на клиента и обрабатывать клиентом. Все что можно сделать на сервере - надо делать там.

Эммм.... редактирование данных на сервере? Вы в курсе для чего придумывались РСУБД? Вы в курсе, что хранимки так же оборачиваются в транзакцию? Еще раз подчеркну мы всегда работаем с устаревшими данными, это суть РСУБД.


То что вы называете максимальным уровнем изоляции - является блокировкой от изменений.

Это называется максимальным уровнем изоляции у транзакции. Учите матчасть.


ОРМ на устаревание влияет тем что хранит данные какое-то время на клиенте.

У вас это происходит всегда. Как только вы отобразили пользователю в форме данные с сервера, они устарели. ORM на это никак не влияет.


Если этой возможностью ОРМ не пользоваться то оно вырождается в странную прокладку между результатом запроса и контролом.

У вас весьма странные представления о ORM. Инвалидацию кеша никто не отменял. К примеру если я запросил обновление данных, то объект не будет создан по новой, а сначала произойдет проверка валидности данных. Если валидны мне вернут данные из кеша ORM, если нет то обновится уже существующий объект и будет отдан он.

[identity profile] fraks-nsk.livejournal.com 2013-04-03 04:18 pm (UTC)(link)
>> Вы в курсе, что хранимки так же оборачиваются в транзакцию?

В курсе. В Firebird вне транзакции можно только генератор дернуть.

Я не писал "редактирование на сервере", читайте внимательнее.

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

Кэш на клиенте и соответственно нужна в его валидации - это и есть один из минусов идеологии ОРМ.

[identity profile] norguhtar.livejournal.com 2013-04-03 05:19 pm (UTC)(link)

Я не писал "редактирование на сервере", читайте внимательнее.

Писали работать с данными на сервере, это оно и есть.


Кэш на клиенте и соответственно нужна в его валидации - это и есть один из минусов идеологии ОРМ.

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

[identity profile] fraks-nsk.livejournal.com 2013-04-03 05:46 pm (UTC)(link)
>> Я не писал "редактирование на сервере", читайте внимательнее.

>> Писали работать с данными на сервере, это оно и есть.

Нет, это разные вещи.

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

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

(no subject)

[identity profile] norguhtar.livejournal.com - 2013-04-04 02:27 (UTC) - Expand

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2013-04-04 02:46 (UTC) - Expand

(no subject)

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

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2013-04-04 03:21 (UTC) - Expand

(no subject)

[identity profile] norguhtar.livejournal.com - 2013-04-04 03:30 (UTC) - Expand

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2013-04-04 04:13 (UTC) - Expand

(no subject)

[identity profile] norguhtar.livejournal.com - 2013-04-04 04:36 (UTC) - Expand

[identity profile] fraks-nsk.livejournal.com 2013-04-03 04:04 pm (UTC)(link)
Про блокировки транзакциями - почитайте про оптимистические и пессимистические блокировки
http://ibase.ru/devinfo/plocks.htm

Блокировка НЕ транзакцией - например если сервер не поддерживает транзакции. Или если надо блокировать на длительное время что транзакцией делать крайне нежелательно - тогда флагами, таблицами со списком блокировок, отдельным приложением которое ведет списки блокированных объектов... мало ли чего можно придумать.
Вот атомарность транзакции или ее свойство Repeatable Read никаким другим механизмом не заменишь. А блокировку в принципе можно.

[identity profile] norguhtar.livejournal.com 2013-04-03 04:20 pm (UTC)(link)
Я вообще в курсе что такое блокировки. И да все серверы РСУБД в данный момент так или иначе поддерживают транзакции. А то что вы описываете это не блокировка на уровне РСУБД это логическая блокировка.

[identity profile] fraks-nsk.livejournal.com 2013-04-03 04:31 pm (UTC)(link)
Так я про то и говорю что для реализации уверенности в актуальности имеющихся данных не обязательно пользоваться средствами блокировки на уровне СУБД.

[identity profile] norguhtar.livejournal.com 2013-04-03 05:29 pm (UTC)(link)
Вообще при использовании РСУБД обязательно. Так-как даже если вы их не используете транзакции никуда не деваются.

[identity profile] fraks-nsk.livejournal.com 2013-04-03 05:47 pm (UTC)(link)
Объясните мне еще про транзакции, я про них первый раз слышу.

(no subject)

[identity profile] norguhtar.livejournal.com - 2013-04-04 02:28 (UTC) - Expand

(no subject)

[identity profile] fraks-nsk.livejournal.com - 2013-04-04 02:48 (UTC) - Expand

(no subject)

[identity profile] norguhtar.livejournal.com - 2013-04-04 03:09 (UTC) - Expand