Oct. 1st, 2010

metaclass: (Default)
[livejournal.com profile] zabivator опять поднял свою любимую тему.

Я таки сформулировал, чего меня не устраивает в РСУБД, перепощу сюда чтобы не забыть:

Что меня бесит в СУБД:

1) Хреновая интеграция баз и статически типизированных языков. Т.е. постоянно нужно делать что-то вроде FieldByName("имя_поля") и тому подобное, что очень легко сломать. Обходится кодогенерацией из схемы базы или из запросов и проверкой при запуске что схему не изменили несовместимым образом. ORM и тому подобное - это так, паллиатив, вынесли литералы из кода в конфиги.

2) Хреновое взаимодействие с контролем версий. Я бы сказал, очень хреновое, т.к. в общем случае изменения в базе необратимы, в отличие от кода в VCS. Как решить - а хер его знает, т.к. в отличие от кода, который можно откатить на старую версию по частям и в худшем случае он просто не соберется, в базе все взаимосвязано так, что хрен ты откатишь одно изменение, если поверх него уже сделаны другие. Я даже теоретически себе это с трудом представляю. Короче "самосогласованный откат изменений в графе", можно вешаться.

3) Это тоже относится к 2) про это еще rainman_rocks писал - программисты ненавидят ALTER TABLE, т.к. изменить и перекомпилировать код гораздо проще чем изменить базу.

4) Хреновейшая работа с вложенными коллекциями и вообще всем, что сложнее чем "список плоских записей". Проблема 1+N запросов и тому подобное. Лечится исключительно методом "встраиваем прямо внутрь БД сборку сложных объектов из результатов запросов и сериализацию полученного в какой-нибудь JSON", поимев в результате логику в БД, зависимости от таблиц и прочий шлак. Еще можно рядом с СУБД поставить сервер приложений, делающий то же самое, но внутри сервера быстрее. А еще в дотнете в норме 1+N запрос еще и не выполнишь - не у всех драйверов доступа можно лениво фетчить одновременно из двух резальтсетов.


1 и 4 можно исправить, впилив в сервер какой-нибудь язык с явной поддержкой нормальных типов(кто сказал Haskell?), а в клиентскую либу вставив автоматическую кодогенерацию (на всех over 9000 языках) из запросов и проверку схемы при подключении.

2 и 3 - хрен его знает, наверно теорию применения изменений в графах неебического размера придумывать надо, и использовать БД, которая не удаляет данные даже если их дропнули, изменили, итд. Тогда откатится будет в некоторых случаях возможно. Что делать с стогигабайтными БД в таком случае - наверно вешаться.
И в системы контроля версий встраивать модули интеграции с БД, которые бы генерировали скрипты применения и отмены изменений. Или при разработке с использованием БД использовать систему контроля версий прямо в этой же БД, с явной процедурой деплоймента, т.е. созданием из текущей ревизии собранного кода+все миграции со всех других вариантов БД из прошлых ревизий.
metaclass: (Default)
Обновлял комп на работе, взяли материнку от ASUS (P7P55D-Evo), потому как предыдущие материнки от них у меня работали удачно, проц i7-2.8 ггц и 4 гига памяти.
Материнка сразу испугала миллиардом параметров в биосе, связанных с оверклокингом. Судя по
всему, все хай-енд материнки от асус сейчас идут с таким вуду.
Ну, я сразу все эти параметры сбросил в дефолтные, ибо нефиг.
Вроде бы все заработало от входа, но потом с компом начал твориться нечеловеческий бред.
Во-первых, спонтанно замерзает. Т.е. повис и все. Иногда, через 15-30 секунд отвисает и продолжает работать.
Во-вторых, иногда не загружается вообще, просто не доходит до загрузчика винды. Если включить Safe Mode - грузится.
В-третьих, еще более иногда виснет видео(GT-240), показывает фигню какую-то типа синих рандомных полос по экрану, потом или виснет окончательно, или отвисает обратно. Иногда это же приводит к BSOD с информацией "видео-драйвер повис внутри себя, не реагирует, умираем".

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

Сегодня же началось еще более вуду: с вечера комп виден в виндовой сети, пингуется, порт RDP доступен, но залогинится в RDP невозможно. Утром залогинится стало возможно, но первое что я увидел, что часы сбились на 8 часов 14 минут, это вообще бред какой-то. Пришел на работу, комп на локальную мышь и клавиатуру ноль внимания, на экране висит скринсейвер. По RDP залогинится можно, что я и сделал и отправил его на перезагрузку.

Ребе белнетмон советует сменить материнку по гарантии, но во первых, нет уверености что это именно материнка(хотя с застрявшими RTC вряд ли это будет что-то другое), во вторых, по гарантии ее не примут, т.к. вероятность что она не заработает при проверке, близка к нулю, в третьих, разобрать этот комп это еще на неделю отложить всю работу.

Я бы пошел по тупому пути купить новую материнку и проц и проверить их. (Пока писал пост, комп опять завис).
metaclass: (Default)
5) Хреновый реюз кода в SQL. Если мы хотим применить одинаковые сложные условия отбора к двум _разным_ таблицам, мы не сможем это сделать, написав код один раз. Код будет копипастой два раза - для двух таблиц.

6) Печаль с системой типов. Среди доступных типов полей нету ADT, а они, вообще-то, были бы весьма полезны. Теоретически ничего вроде бы не мешает их добавить. Кроме рекурсивных типов, само собой - это вуду, которое отражается на разные таблицы и тянет за собой ту же хрень что ORM.
metaclass: (Default)
Мне эта часть девятой симфонии сама по себе нравится, но в исполнении Therion оно вообще позитив.
metaclass: (Default)
Решил я по совету использовать курсоры, чтобы вернуть результат нескольких запросов в одном резалтсете. Ну то есть решить проблему 1+N запросов.

Сделал такой примерчик
ссылко1
ссылко2, скрипт
По идее, на каждую строку результсета должен вернутся открытый курсор, то бишь, мы фетчим внешний резалтсет, а внутри цикла фетча пытаемся фетчить полученный курсор.

На данный момент пока хрен что у меня получается, т.к. все компоненты доступа(и в дельфи, и в дотнете) возвращают первое поле запроса результат запроса "select * from myfunc() as test(a refcursor,b varchar(40))" видят тупо как строку и ни с какого бока к этому курсору не подступится.

Синтаксис работы с курсорами и возвращения множеств из функций postgresql тоже в некотором роде печалит, но это следствие видимо того, что я привык в этому плане к аккуратному синтаксису Firebird.

PS: Кстати, что забавно: в примерах везде приведены только самые простые случаи типа "возвращаем один курсор, возвращаем два заведомо известных курсора", а вот комбинацию "возвращаем множество туплов из курсора и атомарного типа" пришлось придумывать самому, с извращениями в виде create type.

PPS: Гамон. Победил эту хрень. исправленный скрипт (отличия - именование курсора и убрано его закрытие)
1)курсоры нужно именовать уникально, типа
cur='returnedcursor' || cast(parentid as varchar);
2)курсоры не нужно закрывать, т.к. второй запрос выполняется только после того как целиком выполнится первый, а не внутри него, как хотелось бы.
3)возвращенное в первом запросе имя курсора нужно использовать, чтобы обратится к его результатам:
Delphi: 'fetch all from '+q.Fields[0].AsString;
.NET: cmd2.CommandText = "FETCH ALL FROM "+reader1.GetString(0);
4)в дотнете это работает только с PreloadReader=true, иначе ругается что "уже открыт DataReader", я про это уже писал, что только Firebird умеет открывать более одного ридера.

В общем, те же яйца, вид в профиль.
Не знаю, как насчет парсинга запроса и кэширования результата парсинга, запросто может быть, что оно каждый раз во внутреннем цикле это делает повторно, то бишь опять та же проблема 1+N, только стоя и в гамаке.
Кроме того, сразу видно, что PL/pgSQL это ад, т.к. присваивая переменной курсора имя, мы делаем это имя до закрытия курсора доступным в FETCH ALL FROM, то есть, явное смешение данных и метаданных. Это можно было бы считать метапрограммированием, но это больше похоже на динамическую типизацию(анафема!!).

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 6th, 2025 07:45 pm
Powered by Dreamwidth Studios