atv
Новичок
нет.я спросил именно про 1:1. умеет ли оно подтягивать такие отношения сразу?
нет.я спросил именно про 1:1. умеет ли оно подтягивать такие отношения сразу?
Да, надо будет подумать. Сразу я этот момент упустил.Я бы дополнил - при необходимости.
в том то и дело - что эта задача не совсем тривиальнаяИМХО в ORM самое сложное не вытянуть что-либо связанное, а определить когда это нужно делать.
а можно в двух словах, в чём там подвох?в том то и дело - что эта задача не совсем тривиальная
запрос представь... а лучше - напишиа можно в двух словах, в чём там подвох?
Ну тут две большие разницы - когда необходимо, и когда можно было быАвтор оригинала: whirlwind
>умеет ли оно подтягивать такие отношения сразу?
Я бы дополнил - при необходимости. ИМХО в ORM самое сложное не вытянуть что-либо связанное, а определить когда это нужно делать.
Doctrine_Collection::LoadRelated(). Вы просто не умеете ее готовить.По такому принципу Doctrine вытягивает связанные объекты. Потом, при создании связанных объектов, приходиться разгребать дублирующиеся записи. При бОльшем объёме выборки, больше данных передаётся в скрипт, больше памяти, больше разгребать. Т.е. объём выборки продавцов напрямую зависит от объёма выборки заказов.
Я решил попробовать по другому. Связанные объекты вытягиваются отдельным запросом. В этом случае, количество запросов равняется количеству вытягиваемых сущностей. Т.е., чтобы вытянуть заказы и продавцов, будет выполнено два запроса, независимо от объёма выборки, причём объём выборки продавцов не будет напрямую зависеть от объёма выборки заказов.
А кеш запросов (не результатов, а запросов) смог включить в Doctrine? А если померять с HYDRATE_ARRAY или HYDRATE_NONE?Автор оригинала: atv
Результаты benchmark'а я ещё не подготовил к публикации. Сейчас могу только сказать, что данная библиотека оказалась быстрее Doctrine где-то на 30%. Propel обогнал данную ORM по селектам где-то на 50%, по остальным операциям отстал тоже где-то на 30%.
Да, невнимательно изучал.Doctrine_Collection::LoadRelated(). Вы просто не умеете ее готовить.
Никак, я уже написал, что решил отказаться от этого варианта.При этом не увидел у Вас, как можно вытащить связанные объекты с помощью join'а.
Это потому, что их нет, упоминаний. Реализация many-to-many пока отложена до лучших времён. Так как "они делаются за счет 2 x one-to-many."Также не нашел внятных упоминаний про many-to-many relations.
Нет, возможно появится в будущем. Это было не приоритетной задачей для меня.Есть ли способ загружать такие поля вместе со всеми остальными?
Терпение, немного терпения. В ближайшее время постараюсь подготовить результаты.Но лично я бы не стал переходить на нее с доктрины ради 30% (не совсем понятно как измеренной)
Ой ли. У LightOrm гибкость не отстаёт, при том что не используется специальный язык запросов. Я как раз и добивался большой гибкости, без использования языка запросов, чтобы поднять производительность.принимая во внимание, что доктрина погибче будет
ОРМ перестаёт быть ОРМ, если она уже не создаёт объектов, а просто возвращает результат запроса, это уже будет не ОРМ, а квэри билдер. А я сравнивал ОРМ.А а если померять с HYDRATE_ARRAY или HYDRATE_NONE?
Откуда LightOrm знает, когда они стали ненужными?В ней объекты автоматически освобождаются из памяти после того как стали ненужными.
Имхо довольно сомнительные доводы.А она будет бесполезно израсходована на зависшие в памяти объекты, и станет, в даном случае, ещё и тормозом, так как её сперва нужно будет выделять, а потом очищать, по завершении работы скрипта, а эти опреации ресурсоёмкие.
1) А только что Вы говорили, что не поддерживаются выборки с помощью джоинов, lazy loading на уровне запросов, many2many, HYDRATE_ARRAY, и т.д. ... Это гибкость? И потом, где гарантия, что когда Ваш roadmap будет реализован, LightORM не станет медленнее доктрины? Запас то всего ничего.Ой ли. У LightOrm гибкость не отстаёт, при том что не используется специальный язык запросов. Я как раз и добивался большой гибкости, без использования языка запросов, чтобы поднять производительность.
То есть проблема освобождения памяти при циклических связях в PHP может быть решена с помощью LightOrm?
В LightOrm есть механизм подсчёта количества ссылок на объект. (см. ItemReference). Пока на объект остаются ссылки в коде, он продолжает жить в кеше. Как только, последняя ссылка была удалена, запускается метод release() объекта, который убирает циклические ссылки и удаляет объект из кеша.Откуда LightOrm знает, когда они стали ненужными?
Я уже высказывался в других топиках на эту тему. Я считаю неоправданным расточительством использовать ОРМ для построения ХТМЛ таблиц, тем более, что она для этого не предназначена. Для ХТМЛ таблиц вполне достаточно, и даже более практично использовать связку из DataSet и Grid.Все таки на практике чаще всего выводятся данные на страницу для чтения.
Нет, это относится к функциональности, а не гибкости.А только что Вы говорили, что не поддерживаются выборки с помощью джоинов, lazy loading на уровне запросов, many2many, HYDRATE_ARRAY, и т.д. ... Это гибкость?
Вот и я говорю, зачем городить огород из лишней функциональности, которая снижает общую производительность, чтобы потом от неё отказываться при оптимизации.Кто мешает при работе с доктриной использовать объектный квери-билдер вместо DQL ?
Да, вобщем то, всё уже реализовано, осталось только many-to-many и lazy properties подправить, это, по идее, снизит производительность, но не более чем на 2-3 процента.И потом, где гарантия, что когда Ваш roadmap будет реализован, LightORM не станет медленнее доктрины? Запас то всего ничего.
Но, в принципе, выполнимаяАвтор оригинала: zerkms
в том то и дело - что эта задача не совсем тривиальная
Ой ля ля. Мы скоро запутаемся в терминологии , пора наводить порядки в терминах.Но, в принципе, выполнимая
какое дублирование?1) одним запросом, получая при этом дублирование строк
когда выбираешь связь один-ко-многим, то сущность, входящая в отношение как "один", продублируется по количеству сущности "многие". (doctrine)какое дублирование?
Ты это назвал отношением один-к-одному?отправитель (message.sender_id <-> user.id), получатель (message.recipient_id <-> user.id)
эм... пардон, 1:NТы это назвал отношением один-к-одному?
Абсолютно не согласен. Единственное отличие от FETCH_RECORD - это формат результата. Все остальное остается прежним:ОРМ перестаёт быть ОРМ, если она уже не создаёт объектов, а просто возвращает результат запроса, это уже будет не ОРМ, а квэри билдер.
Можно поподробнее? Это делается множественными запросами с limit'ом, или как?Плюс к этому, есть буферизация, т.е. когда делаеш итерацию по таблице, в которой 10000 записей, то не беспокоишься о памяти, так как выборки происходят порциями, в зависимости от размера буфера.
По мне так пусть лучше будет бОльшая нагрузка именно на бэкенды, чем на сервера баз данных... просто исходя из масштабируемости оных. Ваша же ORM пока демонстрирует более тяжелую работу с бд в угоду более деликатному отношению с бэкендами. Имхо не очень правильные у Вас приоритеты.Конечно, для сайта, расход памяти не самый критичный показатель, до определённого момента - возросшего количества посетителей. Вот тогда загрузка памяти станет узким местом.
Хорошо, давайте с этим тоже разберемся. Доктрина позволяет пользоваться большим кол-вом вкусных фишек, которые "из коробки" дают среднюю производительность (хотя, при этом есть такие вещи, как limit-subquery-algorithm). Когда проект вступает в фазу оптимизации, то у разработчика есть все необходимые "ниточки", чтобы довольно легко оптимизировать ее использование. Где-то использовать loadRelated, а где-то, наоборот, переписать на джоины или подзапросы (надеюсь, Вы не станете утверждать, что джоины и подзапросы бесполезны для производительности). Где-то воткнуть FETCH_ARRAY, и т.д., до тех пор, пока разработчика не станет устраивать производительность.Вот и я говорю, зачем городить огород из лишней функциональности, которая снижает общую производительность, чтобы потом от неё отказываться при оптимизации.
Вообще, у доктрины интересный подход, в заголовки вынесено что она может и то, и это, а в конце документации советы - лучше этого не использовать, так как проблемы с производительностью. [cut]
Поэтому, ещё раз подчёркиваю, одна из целей проекта, найти оптимальное соотношение между функциональностью и производительностью, которое можно определить только на практике.
Для меня это самое важное отличие. Кстати, а зачем режим FETCH_ARRAY? Думаю для того, чтобы строить HTML таблицы. Так на это у меня тоже есть определённое мнение, которое я изложил на странице проекта LightOrm.Абсолютно не согласен. Единственное отличие от FETCH_RECORD - это формат результата.
Да.Можно поподробнее? Это делается множественными запросами с limit'ом
Совсем нет, моя ORM позволяет настраивать свою работу с памятью. Размер буфера можно изменять, настраивая его на оптимальное значение при оптимизации. Это прибавляет больше гибкости, по сравнению с Doctrine.Ваша же ORM пока демонстрирует более тяжелую работу с бд в угоду более деликатному отношению с бэкендами.
Кстати по поводу производительности, смотрите тесты выше.Доктрина позволяет пользоваться большим кол-вом вкусных фишек, которые "из коробки" дают среднюю производительность
Не надейтесь, не станунадеюсь, Вы не станете утверждать, что джоины и подзапросы бесполезны для производительности
Боже упаси, никакого принуждения, кто хочет, может пользоваться Doctrine А вот про меньшее удобство говорить рано, пока вы ей не воспользовались.Так что ИМХО цель Вашего проекта сводится к принуждению пользоваться [якобы] заведомо оптимальными, при этом, как правило, менее удобными средствами.
Гибкость доктрины опирается на DQL, которое позволяет получать практически всё многообразие выборок языка SQL.Так что я считаю, что именно доктриновский подход является более гибким.