Doctrine2 ... Лучший режим гидратации? - PullRequest
12 голосов
/ 22 июля 2011

Я разрабатываю систему бронирования номеров, которая состоит из девяти объектов, которые все связаны друг с другом. В этом конкретном случае я извлекаю 10-30 строк из сущности entry, которая имеет 25 свойств. Каждая запись имеет один room, который имеет 10 свойств. Мне нужна вся информация о входе, а также entry->room->id и entry->room->name. Но похоже, что доктрина загружает все room, когда я использую Query::HYDRATE_ARRAY. Кажется, в Query::HYDRATE_OBJECT легче загружать

Итак, мне интересно, если режим Query::HYDRATE_OBJECT работает быстрее или "лучше", чем Query::HYDRATE_ARRAY / Query::HYDRATE_SCALAR / Query::HYDRATE_SINGLE_SCALAR. Поскольку я повторно использую какой-то старый код, я бы хотел использовать HYDRATE_ARRAY, но только если это не замедлит работу приложения.

1 Ответ

15 голосов
/ 22 июля 2011

Мои 2 цента:

HYDRATE_OBJECT лучше всего подходят, когда вы планируете использовать много бизнес-логики с вашими объектами.Особенно, если вы делаете много манипуляций с данными.Это также, вероятно, самый медленный (в зависимости от ситуации).

HYDRATE_ARRAY обычно зарезервирован для случаев, когда вам нужен только результат и 1 степень реляционных данных, и он будет использоваться только для целей печати / просмотра.

HYDRATE_NONE - это еще один вариант, который я использую, когда выбираю только очень маленькое подмножество данных (например, одно или два поля вместо всей строки).Это ведет себя так же, как необработанный результат запроса.

Это также может представлять интерес http://www.doctrine -project.org / 2010/03/17 / doctrine-performance-revisited.html

Это из 1.2 документов, но я думаю, что советы по гидратации применимы в 2.0 http://doctrine.readthedocs.org/en/latest/en/manual/improving-performance.html

Еще одно важное правило, относящееся к этой категории: выбирайте объекты только тогда, когда они действительно нужны,В Doctrine есть возможность извлекать «графы массивов» вместо графов объектов.На первый взгляд это может звучать странно, потому что зачем тогда использовать объектно-реляционный картограф?Потратьте секунду, чтобы подумать об этом.PHP по своей природе является преддуральным языком, который был расширен множеством функций для достойного ООП.Массивы по-прежнему являются наиболее эффективными структурами данных, которые вы можете использовать в PHP.Объекты имеют наибольшую ценность, когда они используются для выполнения сложной бизнес-логики.Это бесполезная трата ресурсов, когда данные оборачиваются дорогостоящими объектными структурами, если вы не пользуетесь этим

При использовании HYDRATE_ARRAY:

Можете ли вы подумать о какой-либо выгодеиметь объекты в виде вместо массивов?Вы не собираетесь выполнять бизнес-логику в представлении, не так ли?Один параметр может сэкономить вам массу ненужной обработки:

$blogPosts = $q->execute(array(1), Doctrine_Core::HYDRATE_ARRAY);
...