[Moscow.pm] v2 просьба о ревью модуля DBIx::Struct

PEF Secure pef-secure на yandex.ru
Чт Янв 15 09:16:21 PST 2015


On Thursday, January 15, 2015 19:19:25 Warstone на list.ru wrote:
>  То есть сложных проектов, где есть "Ядро" и "Приложение", или гетерогенных,
> сервис-ориентированных приложений вы не писали? Хорошо... Вот вам пример из
> жизни...

Придумывание чужих профилей самостоятельно -- это такое завуалированное 
оскорбление? 

> Есть Ядро, в ядре есть определение пользователя. Таблицы пользователя. Как
> будет использоваться пользователь и какие у него будут дополнительные поля
> определяется приложением.  Ядро заботится о "стандартных" полях. У
> пользователя есть аватар. В модели есть аксессор для урла на аватар. Ядро,
> зная что серверов много и выбирая какие сервера сейчас активны, на каких из
> них есть этот аватар и т.д. отдает Урл аватара. Для Приложения это просто
> аксессор.

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

> То что я описал - это один из примеров. Возможно не самый лучший. Но он дает
> представление о том, что ждут большие приложения от ORM'а. Если вы сможете
> поддержать ORM, когда я, написав сложный SQL запрос с аггрегатами и
> оконными процедурами в результате получив пользователя , получу урл на
> аватар, прогнанный через мой аксессор, не указывая что это пользователь (то
> есть ORM сам должен понять - откуда это взялось и что надо сделать с
> полями), то можно начинать разговаривать про ваш ORM.

В моём представлении, тут уже есть некоторая смесь понятий ORM и логики ядра. 
Ядро спросили URL, оно ответило. Откуда оно его взяло, какими модулями 
пользовалось -- совсем не важно. Для ядра у меня есть другой фреймворк, в 
котором _возможно_ использовать DBIx::Struct, он (другой фреймворк) не готов к 
публичному релизу и я его пока не намереваюсь обсуждать. 

В самом первом сообщении я сразу определил, что модуль не пытается строить из 
себя настоящую ORM, но обладает её некоторыми чертами. Все "сложные" случаи 
оставлены "настоящему" SQL, который, на мой взгляд, куда понятнее и проще 
поддаётся отладке.

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

Я не знаю что у Вас там за приложение, но, видимо, что-то мега-крутое. В своих 
проектах последние 5 лет стараюсь использовать только PostgreSQL, чему и рад, 
столкновения с MySQL часто вызывают у меня недоумение. Например, рекурсивный 
запрос для построения дерева комментариев к статье.

> Согласен. Хотя у нас используются сразу 2 СУБД: PostgreSQL и MySQL. Такой
> вариант немного сбивает с толку, правда?

Правда. Никто не застрахован от "странных" случаев. Мне приходилось работать 
одновременно с PostgreSQL и MySQL, но вторая база только для "специальных" 
случаев, там можно просто DBIx::Connector как есть использовать.

> Это не следует из вышенаписанного по причинам, изложенным выше.

Это моя точка зрения. Если база известна, то "диалект" SQL уже не является 
препятствием. Проблема, когда пишется что-то обобщённое, что должно учитывать 
возможные диалекты.

> Для этого и существуют ORM. ORM (Object Relationship Mapping) и есть эта
> абстракция и именно об абстракции мы и говорим.

Целей у неё, как я понимаю, две: концептуально не использовать SQL, перейдя на 
"родные" структуры языка; абстрагироваться от БД, что может дать некоторую 
свободу приложению, а может и наоборот, внести ограничения.

> SQL::Abstract для этого и придумали. Не только для этого, конечно. Они не
> мыслили так узко.

Ну ясно дело, узко -- это мой удел, я понял.

> Вы на этапе архитектуры подписались на то, что у вас не будет высокой
> нагрузки, так как иначе будет боттлек в базе. И чем больше логики вы будете
> класть в базу (а вы будете это делать, по причинам вышеописанным) тем вам
> будет потом больнее это переделывать.

Чем больше нагрузка на базу, тем сильнее надо думать о кешировании данных. Это 
выходит за рамки модуля. Хранимые процедуры, наоборот, за счёт более близкого 
доступа к данным дают выше пропускную способность базы, с тригерами тоже надо 
быть аккуратными, но в правильных случаях они не мешают и помогают сохранить 
логическую стркутуру базы.

Вобщем, про боттлнек в базе _тут_ не понял.

> Вы между первым и 2м выбрали первое. Вам не нужен ORM вообще. 

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

$row = $dbh->selectrow_hashref('select * from user where login = ? and 
password = ?', undef, $login, $password) 

за много лет задолбало. В итоге оно постепенно вылилось в то, что при коннекте 
получается структура таблиц, между ними строятся связи, по этим связям можно 
создавать упрощённые запросы:

$row = one_row([article => -join => 'author'],{id_article => $id_article}) 

в объекте $row будет разбирая на поля выборка 

select * from article join author on (article.id_author = author.id) where 
id_article = ?

Получилось у меня привести это к чисто перловым структурам данных? Мне 
кажется, вполне. 

Абстрагировался ли я от конкретной БД? Ну почти, реальные тесты делал только 
на PostgreSQL, предусмотрел пару моментов по майскл и склайт, но их не 
тестировал за неимением. 

Стало ли это выглядеть лучше, чем было? Ну мне так больше нравится. 

> И приложение не проектируется под большую нагрузку. 

Максимально допустимая нагрузка определяется множеством факторов. Как по мне, 
модуль DBIx::Struct вряд ли будет тормозом. Даже скорее наоборот, расход 
памяти для хранения данных ниже, чем когда строка результата выборки 
представлена хешем. Грубое тестирование не выявило разницы с чистым DBI.

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

Имею иное мнение :)
-- 
PEF Developer


Подробная информация о списке рассылки Moscow-pm