PGDBObject

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    PGDBObject - Presentation Transcript

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

    + Smirnov.AndreySmirnov.Andrey, 3 years ago

    custom

    604 views, 0 favs, 0 embeds more stats

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 604
      • 604 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 10
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories

    Tags