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

PEF Secure pef-secure на yandex.ru
Чт Янв 15 12:22:06 PST 2015


On Thursday, January 15, 2015 21:46:04 Warstone на list.ru wrote:
> Ну просто
> обычно это делается так: UserRS->search({id => $uid})->single->avatar_url
> При всем при этом в User.pm (которое схема таблицы User) лежит что-то такое:
> sub avatar_url {
>     ...
>    my $candidates = _get_best_candidates_as_array;
>     return  $candidates->[random(scalar @$candidates)];
> }
> То есть вызов отдает разные данные, при том что само поле содержит только
> ссылку на картинку (которая не всегда должна совпадать с именем
> пользователя или его id).

В моём варианте можно унаследовать класс DBC::User и сделать то же самое. 
Пользовался подобным несколько раз, но, в основном, "всё иначе" и объекты БД 
не привожу к ООП (смеси данных из БД и произвольных методов), а определяю 
отдельный API работы с ядром, а что вернёт хендлер метода API уже дело 
хендлера.

>  Только для приложения - пользователь - это данные. И с этими
> данным оно пойдет в модель, которая ORM (зачем 100500 модулей городить?
> Больше пакетов богу пакетов?) 

Ни разу не наблюдал особой проблемы с количеством модулей. Ах, да, я ж, 
наверное, "не писал сложных проекто никогда". Возможно.

> Сложные варианты действительно проще делать на чистом SQL'е понимая чем это
> грозит. 

Да ничем, кроме некоторой негибкости кода, по моему мнению.

> Действительно в данном случае так оказалось быстрее.
> Использовать MySQL как Key-Value

Ой. И никакой ORM? 

> В SQL::Abstract думали еще и о том, что это должно
> выполняться на как можно большем количестве диалектов, допустим.

Ну да, поэтому работу с offset/limit решили не делать. SQL::Abstract. как ни 
странно, ничего не хочет знать про БД, он именно абстрактный "вычислитель 
запросов".


> Ну... А за рамки ORM не выходит, ИМХО. И кешировать не все
> и не всегда получается. Хранимки дают большую скорость очень редко. 

Зависит от ситуации. Хранимки выполняют две функции: поддержание некоторого 
API БД и исключение лишнего трафика клиент-сервер. Если сам запрос достаточно 
тяжёлый и лишнего трафика сервер-клиент нет, то хранимка особого выигрыша в 
производительности не даст, но некоторые алгоритмы там всё-таки разумнее 
реализовывать. Но, собственно, кому я рассказываю.

> База одна и она медленная. Беков много и пофиг что они
> медленные, их много. Так понятнее? 

Нет, так как раз запутаннее. Сначала надо всё-таки полную структуру 
подразумеваемого приложения понять. Фронт запрашивает ядро. Ядро обращается к 
бекенду. Бекенд обращается к базе. При этом объекты ORM выступают в роли 
бекенда (или ядра?). Я запутался.

Я признаюсь, ни разу не писал, когда бекендов много. Или когда баз данных 
много. У меня были проекты, когда несколько фронтов<->ядро+база, а проблема 
производительности базы решалась ростом RAM и переходом на SSD. Но, я 
чувствую, что это просто мелочь в сравнении с настоящим хайлоадом.

> Посмотрите в сторону DBIx::Simple в связке с SQL::Abstract я думаю вас это
> удовлетворит, так как это оно и есть.

Смотрел когда-то давно. Ну, допустим, я повторил даже чью-то функциональность. 
Но, как мне кажется, я сделал это удобнее. И зачем мне отказываться от того, 
что я написал в пользу других модулей? Например, в моём модуле есть следующий 
сахар (цитата из документации)

Допустим, у нас есть следующие таблицы:

employer:
    id_employer,
    name
  
 employee:
    id_employee,
    id_employer references employer (id_employer),
    id_employee_invited_by
    name

 alter table employee add constraint fk_employee_employee 
     foreign key (id_employee_invited_by) references employee (id_employee);

Тогда можно использовать следующие выражения:

 my $employee = one_row("employee", {name => 'John'});
 my $employer = $employee->Employer;

Последняя строка автоматически по ссылке из объекта $employee выберет объект 
$employer.

my $referenced_by = $employee->refEmployeeInvitedBys;

Эта строка выберет всех "employee", которые были рекомндованы конкретным  
$employee.

my $robert_associates = $employee->Employer->refEmployees(name => 'Robert');

А эта строка выберет коллег этого $employee, у кого имя 'Robert'.

Личто мне этот сахар удобен и экономит код. На счёт эффективности не вижу тут 
проблем так же.

-- 
PEF Developer


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