metaclass: (Default)
[personal profile] metaclass
[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 - хрен его знает, наверно теорию применения изменений в графах неебического размера придумывать надо, и использовать БД, которая не удаляет данные даже если их дропнули, изменили, итд. Тогда откатится будет в некоторых случаях возможно. Что делать с стогигабайтными БД в таком случае - наверно вешаться.
И в системы контроля версий встраивать модули интеграции с БД, которые бы генерировали скрипты применения и отмены изменений. Или при разработке с использованием БД использовать систему контроля версий прямо в этой же БД, с явной процедурой деплоймента, т.е. созданием из текущей ревизии собранного кода+все миграции со всех других вариантов БД из прошлых ревизий.

Date: 2010-10-01 06:39 am (UTC)
From: [identity profile] plumqqz.livejournal.com
1) Хреновая интеграция баз и статически типизированных языков. Т.е. постоянно нужно делать что-то вроде FieldByName("имя_поля") и тому подобное, что очень легко сломать. Обходится кодогенерацией из схемы базы или из запросов и проверкой при запуске что схему не изменили несовместимым образом. ORM и тому подобное - это так, паллиатив, вынесли литералы из кода в конфиги.

— Доктор, если я делаю так — мне больно.
— Да? Ну тогда так не делайте.


По определению база - это нечто внешнее к программе. С таким же успехом можно причитать, что сайт президента РБ хреново приспособлен к типизированным языкам - постоянно приходится делать что-то вроде FieldByName. OWM и тому подобное - это так, паллиатив, вынесли литералы из кода в конфиги.

2) Хреновое взаимодействие с контролем версий. Я бы сказал, очень хреновое, т.к. в общем случае изменения в базе необратимы, в отличие от кода в VCS.

Во-первых, код или данные? Если данные - то эту тему есть пара книжек. Даже порывались внести нечто подобное в стандарт, да передумали. К слову сказать, та же оракла позволяет с этим делом уже сейчас нормально жить. Не без ограничений, увы.
Если код - то не понимаю, что препятствует держать его во всяких VCS.

П.3 - если не делать себе больно как в п.1, то alter table сказать гораздо проще, чем изменить и перекомпилировать код. Угу-угу.

П.4 - судя по всему, это проблемы файрбёрда. По крайней мере с этим проблем как-то не испытывал.

Date: 2010-10-01 06:44 am (UTC)
From: [identity profile] metaclass.livejournal.com
Как раз Firebird единственный кто в дотнете умеет это сразу, без извратов.
Это вообще проблема адо.нет.
Но тем не менее, способ "получить запись и связанные с ней" в серверах бы не помешал. Вместо того чтобы каждый раз это делать в клиентском коде или использовать ORM.

Date: 2010-10-01 06:47 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Но тем не менее, способ "получить запись и связанные с ней" в серверах бы не помешал. Вместо того чтобы каждый раз это делать в клиентском коде или использовать ORM.

В оракле он есть из коробки, в постгресе изготавливается вручную за пять секунд (для похапе и прочих сидиезных жаб, для перла он тоже из коробки).

Date: 2010-10-01 06:50 am (UTC)
From: [identity profile] metaclass.livejournal.com
О, в postgresql же есть встраиваемые языки, а из sp на них данные в произвольном(т.е. не табличном) виде клиенту отдать можно?

Date: 2010-10-01 06:52 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Клиенту можно оставить открытыми курсоры. Курсоры - это резалтсет, элементами которого могут быть как обычные скаляры, так и массивы. Ну и так далее, в общем, все ограничивается только рамками фантазии.

Date: 2010-10-01 07:23 am (UTC)
From: [identity profile] metaclass.livejournal.com
Курсоры могут быть элементами резалтсета?
И кто их потом закроет, когда я фетч завершу?

Date: 2010-10-01 07:35 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Курсоры могут быть элементами резалтсета?

Да, конечно

И кто их потом закроет, когда я фетч завершу?

Закроются сами при завершении транзакции.

Date: 2010-10-01 07:38 am (UTC)
From: [identity profile] metaclass.livejournal.com
Если я верну 1000000 записей, в каждой по курсору для связанных записей, сервер не умрет?:)
Или вложенные курсоры можно принудительно закрыть?

Date: 2010-10-01 07:51 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Если я верну 1000000 записей, в каждой по курсору для связанных записей, сервер не умрет?:)

Курсор создается как табличка в памяти. Хватит памяти - не умрет. Хотя я не очень понимаю, зачем такое может потребоваться. Несколько тысяч курсоров - вполне нормально, но мне и такое не требовалось.

Или вложенные курсоры можно принудительно закрыть?

Это обычные курсоры, ради бога.

Date: 2010-10-01 06:48 am (UTC)
From: [identity profile] metaclass.livejournal.com
Вот то что "база нечто внешнее по отношению к программе" и есть причина проблем.
К примеру с сайтом - очевидно лучше вместо ориентированного на просмотр пользователем html иметь возможность читать непосредственно данные.

Date: 2010-10-01 06:50 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Вот то что "база нечто внешнее по отношению к программе" и есть причина проблем.

Вы что-то как О.Бендер, который видел основную причину скверных снов Хворобьева в советской власти. "База как нечто внешнее по отношению к программе" - это не причина, это данность, если только не мыслить в стиле айн фольк - айн фюрер, айн аппликейшн - айн база.

Date: 2010-10-01 06:52 am (UTC)
From: [identity profile] metaclass.livejournal.com
База это и схема и код и данные, это и есть причина проблем при взаимодействии с VCS.

Date: 2010-10-01 07:21 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Поправь пост, что ли.

Date: 2010-10-01 07:23 am (UTC)

Date: 2010-10-01 08:12 am (UTC)
From: [identity profile] blackyblack.livejournal.com
У господина Крокодила мозги серьёзно свернуты в плане работы с базами, так что все грабли РСУБД он обходит машинально и привычно, а на необходимые грабли закрывает глаза. Если взглянуть объективно, то абсолютно все описанные грабли есть объективно существующая действительность.
From: [identity profile] plumqqz.livejournal.com
на необходимые грабли закрывает глаза

Лучше уж "плюет". Как-то еще образней получается.
From: [identity profile] blackyblack.livejournal.com
Закрывает глаза метафоричней. Потому что можно провести аналогию с реальной жизнью.
From: [identity profile] plumqqz.livejournal.com
Хотелось бы мне тоже пожить такой реальной жизнью, где не хочется ни на что плюнуть.

Date: 2010-10-01 09:31 am (UTC)
From: [identity profile] norguhtar.livejournal.com
Это не грабли, а естественные ограничения. Знаете как-то парадигма другая. Это приблизительно из той же оперы что говорить про ФЯП, фу у вас там объектов нет! А в нас в %languagename% они есть!

Date: 2010-10-01 09:54 am (UTC)
From: [identity profile] metaclass.livejournal.com
Некоторые ограничения естественные (взаимодействие с VCS), некоторые противоестественные.

Date: 2010-10-01 09:56 am (UTC)
From: [identity profile] norguhtar.livejournal.com
А какие из них противоестественные? :] Я желаю знать классификацию!

Date: 2010-10-01 10:05 am (UTC)
From: [identity profile] metaclass.livejournal.com
Противоестественные:
4 пункт и вот это http://metaclass.livejournal.com/549262.html?thread=7371150#t7371150
Реюз кода в SQL действительно тоже печален, я забыл про его упомянуть.

Первый пункт теоретически разрешим и не требует от СУБД на самом деле особых функций, это вопросы к клиентским тулсам скорее.

VCS и alter table даже теоретически непонятно как решить, это действительно естественное ограничение парадигмы на данный момент.

Date: 2010-10-01 10:19 am (UTC)
From: [identity profile] norguhtar.livejournal.com
Четвертый пункт как раз естественен. Это собственно проблема представления в виде плоских таблиц. Connected by конечно частично это решает, но как-то плохо.

Реюз кода это я согласен, но в классической теории СУБД кода нет :)

Date: 2010-10-01 10:25 am (UTC)
From: [identity profile] metaclass.livejournal.com
Резальсету не обязательно быть плоской таблицей. Да даже если плоской - вернуть полем курсор можно, как тут пишут, но не все сервера и компоненты доступа это умеют.

Date: 2010-10-01 10:32 am (UTC)
From: [identity profile] norguhtar.livejournal.com
Для производительности это будет крайне худо, да и работать с таким чистым SQL удолбаешься.

Date: 2010-10-01 08:46 am (UTC)
From: [identity profile] nivanych.livejournal.com
> Хреновое взаимодействие с контролем версий.

Вот это меня, кстати, больше всего бесит.
Кзаалось бы, всё чотко и формально. Хуй-то там.

Date: 2010-10-01 09:24 pm (UTC)
From: [identity profile] thesz.livejournal.com
Postgress умеет, по слухам.

Date: 2010-10-02 06:55 am (UTC)
From: [identity profile] nivanych.livejournal.com
Не помню, чтобы умел.
Надо посмотреть.

Date: 2010-10-02 07:15 am (UTC)
From: [identity profile] thesz.livejournal.com
Bidirectionalizing Graph Transformations Soichiro Hidaka (National Institute of Informatics, Japan); Zhenjiang Hu (National Institute of Informatics, Japan); Kazuhiro Inaba (National Institute of Informatics, Japan); Hiroyuki Kato (National Institute of Informatics, Japan); Kazutaka Matsuda (Tohoku University, Japan); Keisuke Nakano (University of Electro-Communications, Japan)

http://research.nii.ac.jp/~hu/pub/icfp10a.pdf

;)

Date: 2010-10-02 08:38 am (UTC)
From: [identity profile] kurilka.livejournal.com
не нашёл там ни одного упоминания postgres, это где-то между строк написано?

Date: 2010-10-02 12:06 pm (UTC)
From: [identity profile] thesz.livejournal.com
http://bytes.com/topic/postgresql/answers/173974-versioning-control-postgresql

Говорят, что разные версии данных есть, но обратиться нельзя.

Date: 2010-10-02 12:34 pm (UTC)
From: [identity profile] metaclass.livejournal.com
А, MVCC архитектура СУБД - меня мысль насчет того, что база умеет внутри себя хранить версии, а я потом поверх этого еще раз делаю версионность, печалит. В Firebird то же самое.

Но на самом деле, если реализовывать версионность самому в базе, то реально сервер версии не хранит и мусор не накапливает, т.е. эта функция СУБД не используется.

Date: 2010-10-04 10:27 am (UTC)
From: [identity profile] nivanych.livejournal.com
Спасибо, довольно любопытная статья.

Date: 2010-10-01 09:37 am (UTC)
From: [identity profile] guamoka.livejournal.com
А я, ребе, еще писал про плохой код-реюз в SQL, но вы не поддержали- может быть, я неверно выразился.
Пример. Есть запрос, который собирает некоторый объект (граф объектов) из n табалиц. И есть банч условий, скажем, верхнего уровня (к конечному графу), по которому надо фильтровать результат, т.е. 1) получить граф, у которого все теплое, 2) получить граф, у которого все мягкое и т.п. Получается, что запрос отличается только налагаемым условием, но, в моем представлении, нет никакого способа средствами SQL, чтобы скомбинировать код- наследование, аггрегация,- чтобы избежать дублежа, поэтому либо надо шаманить ручками, и собирать запрос на лету, либо держать на 99% идентичные запросы. Может быть, я не в курсе широко известной сильвер буллет?

Date: 2010-10-01 09:53 am (UTC)
From: [identity profile] metaclass.livejournal.com
А, забыл упомянуть.

Date: 2010-10-01 09:59 am (UTC)
From: [identity profile] gds.livejournal.com
в простых случаях есть views.

Date: 2010-11-14 08:57 am (UTC)
From: [identity profile] frotmnenogi.livejournal.com
Проблема 1+N запросов
Тут видимо речь идет о "1+N результатах" :)

Date: 2010-11-14 09:02 am (UTC)
From: [identity profile] frotmnenogi.livejournal.com
В смысле проясните пожайлуста - это про группировку по уникальному ключу с NULLABLE флагом, или про многократную выборку на основе другой (альтернатива JOIN при выносе логики в бизнес-уровень приложения)?

Date: 2010-11-14 12:03 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Многократная выборка на основе другой. Join она не эквивалентна, т.к. в случае join "шапка" объекта повторяется для каждой из вложенных записей-"строк".

Date: 2010-11-14 12:27 pm (UTC)
From: [identity profile] frotmnenogi.livejournal.com
Теперь вкурил. Все же в простейших случаях с помощью группировки и group_concat можно обойтись одним лишь join. Это не рекомендация - просто константация. По мне, работать подобным образом, это все равно, что получать выборку в csv формате.

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 Sep. 3rd, 2025 11:41 am
Powered by Dreamwidth Studios