[Moscow.pm] Размышления на тему ORM и вообще работы с БД

Andrei andrei.protasovitski на gmail.com
Чт Окт 27 05:57:31 PDT 2011


27 октября 2011 г. 14:00 пользователь Ivan Petrov
<i.petro.77.00 на gmail.com>написал:

>
> >> А можно данные каких-нибудь тестов привести в доказательство этого
> > тезиса? А то
>
> > будут, если проект попадет на CPAN.
>
> > Меня интересуют тесты производительности, а не юнит-тесты. Они могут (и
> должны)
> > проводиться до выкладывания в production, даже до CPAN.
>
> тут сравнивать то собственно не с чем.
>
> сравнивать с DBI? этот модуль является над ним надстройкой, то есть
> делает предобработку данных перед трансляцией ему, соответственно
> будет всегда медленнее DBI работать.
>
> сранивать с DBIC? DBIC делает:
> 1. генерацию запросов
> 2. генерацию запросов некачественных (с точки зрения
> производительности SQL)
> 3. POST-обработку выборки и сплит ее в объекты (мы отказываемся
> от этого сразу, ибо поскольку исключаем кривые запросы, то и
>

Это неправда. Нормальный ORM возвращает итератор, а объекты создаёт только
когда они действительно нужны.


> POST-обработка не нужна: то есть в нашем случае получается код в
> предельном случае, состоящий из одной инструкции bless).
>
> то есть узкое место в случае с DBIC будет база данных, которая его
> кривые запросы будет мучиться исполнять.
>

Узкое место, как правило, между клавиатурой и спинкой кресла.


> соответственно единственные тесты производительности о которых можно
> говорить это тесты "как быстро работает темплейтный парсер".
>

Тогда надо сравнивать ваш велосипед с SQL::Abstract, а не с DBIC.


>
> ну вот есть такой тестик.
>
>    SELECT
>        u.*
>    FROM
>        users AS u
>
>    ?if{filters.role_name} {
>        LEFT JOIN roles AS r ON u.rid = r.id
>    }
>
>    ?if{filters.user_name} {
>        LEFT JOIN user_cards AS uc ON u.id = uc.uid
>    }
>
>    WHERE
>        1 = 1
>
>    ?if{filters.role_name} {
>        AND r.name = ?{ filters.role_name }
>    }
>
>    ?if{filters.user_name} {
>        AND uc.name = ?{ filters.user_name }
>    }
>

Всё, после этого запорса можно не читать. Ваша проблема не в ORM, а в том,
что вы не понимаете, для чего он нужен. Внимательно прочитайте, что написал
Andrii Kostenko ранее. А потом ещё раз. И ещё раз.

ORM -- это Object-relational mapping, а не конструктор запросов.

Удачи!
-- 
Andrei Protasovitski
< andrei[dot]protasovitski[at]gmail[dot]com >
Diemen, Netherlands
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20111027/b261777f/attachment.html>


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