Необходимо отличать соединения с целью создания ограничения и соединения с целью повышения эффективности (уменьшение количества SQL-запросов).
Алиасы связей
Возникает необходимость использовать связь несколько раз:
связь используется для соединения с целью ограничения, а также необходимо полное содержимое связи;
по связи необходимо пройти больше одного раза, с разными параметрами.
Алиас создается путем присвоения новых имен одной связи, при этом новые имена полностью наследуют свойства связи ('link_aliases').
Кеширование
Если кеш включен, то решение: взять из БД и положить в кеш или взять из кеша, принимается в момент вызова fetch() (учитываем «ленивость»)
Берем из кеша, если:
существуют данные в кеше (есть соотствующий файл на диске);
дата создания файла проходит под максимальный «возраст» кеша.
Кеш хранит выборку .
Описание связей/кеширования в параметрах конструктора
Для перехода по связи никакие параметры не нужны (поведение по умолчанию!)
Виды описаний:
алиасы связей;
параметры связи;
соединение:
joined;
search_joined.
prefetch_links;
cache.
Параметры: link_aliases
'alias1' и 'alias2' – полноценные альтернативные имена для связи 'link', при этом они могут быть использованы независимо (с разными параметрами, разными способами).
' prefetch_links' - мы хотим, чтобы при получении из БД этой выборки был осуществлено получение указанных связей для каждого элемента нашей выборки;
это не приведет к изменению выборки, не улучшит работу с ней, может привести к «излишним» выборкам связей;
но, если включено кеширование, то содержимое указанных связей попадет в кеш (иначе бы они выбирались отдельными запросами, даже если кеш бы сработал»).
'prefetch_links' => array('link1', 'link2'),
Параметры: cache
'cache' - кеш включается для этой выборки, значение параметра задает имя каталога с кешом (еще есть глобальный выключатель кеширования);
всё остальное – забота PGDBObject: хранение выборок с разными параметрами в разных файлах, кеш для разных сайтов (БД, схем) в разных подкаталогах, и т.п.;
'joined'-связи попадут в кеш всегда, все остальные – только если они попали в 'prefetch_links'
'cache' => 'megaquery',
Вложенность параметров
уровень вложенности – параметры очередной вложенной связи;
для каждого уровня справедливы все перечисленные замечания;
получаем – кеширование на верхнем и вложенном уровне вложенности; вложенный prefetch_links для полного кеширования уровней; вложенный joined и т.п.
0 comments
Post a comment