Your SlideShare is downloading. ×
0
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
PGDBObject
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

PGDBObject

653

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
653
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  1. PGDBObject, связи и кеширование Андрей Смирнов, 15 августа 2006
  2. PGDBObject: цели <ul><li>Внутренности: </li></ul><ul><ul><li>эффективность; </li></ul></ul><ul><ul><li>«ленивые» выборки (fetch()). </li></ul></ul><ul><li>Интерфейс: </li></ul><ul><ul><li>логичность концепции; </li></ul></ul><ul><ul><li>слабая зависимость интерфейса от конкретной БД; </li></ul></ul><ul><ul><li>иллюзия объектной БД. </li></ul></ul><ul><li>Пользовательский код: </li></ul><ul><ul><li>повышение скорости написания кода; </li></ul></ul><ul><ul><li>создание более понятного и простого кода; </li></ul></ul><ul><ul><li>отсутствие SQL-запросов; </li></ul></ul><ul><ul><li>наследование от PGDBObject – «бесплатный» способ хранения объекта в БД. </li></ul></ul>
  3. PGDBObject: основные понятия <ul><li>Свойство: </li></ul><ul><ul><li>поле объекта из БД (описано в структуре); </li></ul></ul><ul><ul><li>«вычислимое» поле (переопределение __get, добавление функций getField()); </li></ul></ul><ul><ul><li>связь с другим объектом (follow()). </li></ul></ul><ul><li>Выборка (PGStructObject): </li></ul><ul><ul><li>ноль, один или несколько элементов; </li></ul></ul><ul><ul><li>«проматывание» выборки; </li></ul></ul><ul><ul><li>один объект – это всегда выборка (а не выборка – набор из нескольких объектов). </li></ul></ul>
  4. Связь <ul><li>Связь – это отношение между двумя классами, заданное видом и условием связи. </li></ul><ul><li>Связь – это поле, значением поля является другой объект (опять выборка типа PGDBObject). </li></ul><ul><li>Связь – это эффективно реализованный механизм. </li></ul><ul><li>Связь – это еще и потенциальный способ ограничения выборки. </li></ul><ul><li>При любом варианте использования, доступа и т.п. - связь является полем. </li></ul>
  5. Переход по связи <ul><li>Если связь еще не была пройдена: </li></ul><ul><ul><li>Создать экземпляр класса другого конца связи, при этом в его конструктор передаются параметры. </li></ul></ul><ul><ul><li>В 'param' собираются необходимые параметры, ограничивающие выборку таким образом, чтобы переход был корректным (работает связь). </li></ul></ul><ul><ul><li>Все остальные параметры берутся из параметров текущего объекта, из подмассива с именем, совпадающим с именем связи. </li></ul></ul><ul><li>Ключевой метод: PGDBObject::follow() </li></ul>
  6. Ограничение по связи <ul><li>Единственный вид ограничения по связи (реляционная модель) – соединение (JOIN). </li></ul><ul><li>Соединение происходит по связи, т.е. соединение с таблицей, соответствующей второму концу связи. </li></ul><ul><li>Вид соединения – по умолчанию LEFT JOIN, при добавлении к имени связи символа '+' - INNER JOIN. </li></ul><ul><li>Соединение может изменить количество и смысл элементов выборки (дублирование, элементы исчезают и т.п.). </li></ul>
  7. Соединение <ul><li>Соединение может приводить сразу к выборке элементов второго конца связи (эффективность). </li></ul><ul><li>Цепочки соединений – вложенность параметров запроса. </li></ul><ul><li>Необходимо отличать соединения с целью создания ограничения и соединения с целью повышения эффективности (уменьшение количества SQL-запросов). </li></ul>
  8. Алиасы связей <ul><li>Возникает необходимость использовать связь несколько раз: </li></ul><ul><ul><li>связь используется для соединения с целью ограничения, а также необходимо полное содержимое связи; </li></ul></ul><ul><ul><li>по связи необходимо пройти больше одного раза, с разными параметрами. </li></ul></ul><ul><li>Алиас создается путем присвоения новых имен одной связи, при этом новые имена полностью наследуют свойства связи ('link_aliases'). </li></ul>
  9. Кеширование <ul><li>Если кеш включен, то решение: взять из БД и положить в кеш или взять из кеша, принимается в момент вызова fetch() (учитываем «ленивость») </li></ul><ul><li>Берем из кеша, если: </li></ul><ul><ul><li>существуют данные в кеше (есть соотствующий файл на диске); </li></ul></ul><ul><ul><li>дата создания файла проходит под максимальный «возраст» кеша. </li></ul></ul><ul><li>Кеш хранит выборку . </li></ul>
  10. Описание связей/кеширования в параметрах конструктора <ul><li>Для перехода по связи никакие параметры не нужны (поведение по умолчанию!) </li></ul><ul><li>Виды описаний: </li></ul><ul><ul><li>алиасы связей; </li></ul></ul><ul><ul><li>параметры связи; </li></ul></ul><ul><ul><li>соединение: </li></ul></ul><ul><ul><ul><li>joined; </li></ul></ul></ul><ul><ul><ul><li>search_joined. </li></ul></ul></ul><ul><ul><li>prefetch_links; </li></ul></ul><ul><ul><li>cache. </li></ul></ul>
  11. Параметры: link_aliases <ul><li>'alias1' и 'alias2' – полноценные альтернативные имена для связи 'link', при этом они могут быть использованы независимо (с разными параметрами, разными способами). </li></ul><ul><li>'link_aliases' => array( 'alias1' => 'link', 'alias2' => 'link', ), </li></ul>
  12. Параметры: joined <ul><li>'joined' - нам интересно получить содержимое присоединенного класса (возможно, осуществить и ограничение). </li></ul><ul><li>при переходе по связям link1, link2 выборки не происходит! </li></ul><ul><li>присоединение даже без доп. параметров может изменить кол-во элементов выборки! </li></ul><ul><li>'joined' => array('link1+', 'link2'), 'link1' => array( 'param' => array('kind' => 57), </li></ul><ul><ul><ul><ul><ul><ul><ul><ul><ul><li>), </li></ul></ul></ul></ul></ul></ul></ul></ul></ul>
  13. Параметры: search_joined <ul><li>'search_joined' - мы не хотим получить содержимое присоединенного класса, нас интересует только ограничение выборки; </li></ul><ul><li>переход по связи link некорректен! </li></ul><ul><li>с точки зрения ограничения выборки joined и search_joined эквивалентны, но search_joined подчеркивает цель соединения. </li></ul><ul><li>'search_joined' => array('link+'), </li></ul><ul><li>'link' => array( 'join_param' => array('mode' => 's'), </li></ul><ul><ul><ul><ul><ul><ul><ul><ul><ul><li>), </li></ul></ul></ul></ul></ul></ul></ul></ul></ul>
  14. Параметры: prefetch_links <ul><li>' prefetch_links' - мы хотим, чтобы при получении из БД этой выборки был осуществлено получение указанных связей для каждого элемента нашей выборки; </li></ul><ul><li>это не приведет к изменению выборки, не улучшит работу с ней, может привести к «излишним» выборкам связей; </li></ul><ul><li>но, если включено кеширование, то содержимое указанных связей попадет в кеш (иначе бы они выбирались отдельными запросами, даже если кеш бы сработал»). </li></ul><ul><li>'prefetch_links' => array('link1', 'link2'), </li></ul>
  15. Параметры: cache <ul><li>'cache' - кеш включается для этой выборки, значение параметра задает имя каталога с кешом (еще есть глобальный выключатель кеширования); </li></ul><ul><li>всё остальное – забота PGDBObject: хранение выборок с разными параметрами в разных файлах, кеш для разных сайтов (БД, схем) в разных подкаталогах, и т.п.; </li></ul><ul><li>'joined'-связи попадут в кеш всегда, все остальные – только если они попали в 'prefetch_links' </li></ul><ul><li>'cache' => 'megaquery', </li></ul>
  16. Вложенность параметров <ul><li>уровень вложенности – параметры очередной вложенной связи; </li></ul><ul><li>для каждого уровня справедливы все перечисленные замечания; </li></ul><ul><li>получаем – кеширование на верхнем и вложенном уровне вложенности; вложенный prefetch_links для полного кеширования уровней; вложенный joined и т.п. </li></ul><ul><li>'link1' => array( 'link2' => array( 'link3' => array( </li></ul><ul><ul><ul><ul><ul><ul><ul><ul><ul><li>.... </li></ul></ul></ul></ul></ul></ul></ul></ul></ul>
  17. Дополнительная информация <ul><li>В wiki можно найти: </li></ul><ul><ul><li>исторические версии PGDBObject и его предшественников; </li></ul></ul><ul><ul><li>ссылки на реальные примеры использования упоминаемых в этом докладе возможностей PGDBObject; </li></ul></ul><ul><ul><li>эту презентацию. </li></ul></ul>
  18. Спасибо за внимание! Вопросы?

×