advertisement

PGDBObject

33 %
67 %
advertisement
Information about PGDBObject

Published on June 27, 2007

Author: Smirnov.Andrey

Source: slideshare.net

advertisement

PGDBObject, связи и кеширование Андрей Смирнов, 15 августа 2006

PGDBObject: цели Внутренности: эффективность; «ленивые» выборки (fetch()). Интерфейс: логичность концепции; слабая зависимость интерфейса от конкретной БД; иллюзия объектной БД. Пользовательский код: повышение скорости написания кода; создание более понятного и простого кода; отсутствие SQL-запросов; наследование от PGDBObject – «бесплатный» способ хранения объекта в БД.

Внутренности:

эффективность;

«ленивые» выборки (fetch()).

Интерфейс:

логичность концепции;

слабая зависимость интерфейса от конкретной БД;

иллюзия объектной БД.

Пользовательский код:

повышение скорости написания кода;

создание более понятного и простого кода;

отсутствие SQL-запросов;

наследование от PGDBObject – «бесплатный» способ хранения объекта в БД.

PGDBObject: основные понятия Свойство: поле объекта из БД (описано в структуре); «вычислимое» поле (переопределение __get, добавление функций getField()); связь с другим объектом (follow()). Выборка (PGStructObject): ноль, один или несколько элементов; «проматывание» выборки; один объект – это всегда выборка (а не выборка – набор из нескольких объектов).

Свойство:

поле объекта из БД (описано в структуре);

«вычислимое» поле (переопределение __get, добавление функций getField());

связь с другим объектом (follow()).

Выборка (PGStructObject):

ноль, один или несколько элементов;

«проматывание» выборки;

один объект – это всегда выборка (а не выборка – набор из нескольких объектов).

Связь Связь – это отношение между двумя классами, заданное видом и условием связи. Связь – это поле, значением поля является другой объект (опять выборка типа PGDBObject). Связь – это эффективно реализованный механизм. Связь – это еще и потенциальный способ ограничения выборки. При любом варианте использования, доступа и т.п. - связь является полем.

Связь – это отношение между двумя классами, заданное видом и условием связи.

Связь – это поле, значением поля является другой объект (опять выборка типа PGDBObject).

Связь – это эффективно реализованный механизм.

Связь – это еще и потенциальный способ ограничения выборки.

При любом варианте использования, доступа и т.п. - связь является полем.

Переход по связи Если связь еще не была пройдена: Создать экземпляр класса другого конца связи, при этом в его конструктор передаются параметры. В 'param' собираются необходимые параметры, ограничивающие выборку таким образом, чтобы переход был корректным (работает связь). Все остальные параметры берутся из параметров текущего объекта, из подмассива с именем, совпадающим с именем связи. Ключевой метод: PGDBObject::follow()

Если связь еще не была пройдена:

Создать экземпляр класса другого конца связи, при этом в его конструктор передаются параметры.

В 'param' собираются необходимые параметры, ограничивающие выборку таким образом, чтобы переход был корректным (работает связь).

Все остальные параметры берутся из параметров текущего объекта, из подмассива с именем, совпадающим с именем связи.

Ключевой метод: PGDBObject::follow()

Ограничение по связи Единственный вид ограничения по связи (реляционная модель) – соединение (JOIN). Соединение происходит по связи, т.е. соединение с таблицей, соответствующей второму концу связи. Вид соединения – по умолчанию LEFT JOIN, при добавлении к имени связи символа '+' - INNER JOIN. Соединение может изменить количество и смысл элементов выборки (дублирование, элементы исчезают и т.п.).

Единственный вид ограничения по связи (реляционная модель) – соединение (JOIN).

Соединение происходит по связи, т.е. соединение с таблицей, соответствующей второму концу связи.

Вид соединения – по умолчанию LEFT JOIN, при добавлении к имени связи символа '+' - INNER JOIN.

Соединение может изменить количество и смысл элементов выборки (дублирование, элементы исчезают и т.п.).

Соединение Соединение может приводить сразу к выборке элементов второго конца связи (эффективность). Цепочки соединений – вложенность параметров запроса. Необходимо отличать соединения с целью создания ограничения и соединения с целью повышения эффективности (уменьшение количества SQL-запросов).

Соединение может приводить сразу к выборке элементов второго конца связи (эффективность).

Цепочки соединений – вложенность параметров запроса.

Необходимо отличать соединения с целью создания ограничения и соединения с целью повышения эффективности (уменьшение количества SQL-запросов).

Алиасы связей Возникает необходимость использовать связь несколько раз: связь используется для соединения с целью ограничения, а также необходимо полное содержимое связи; по связи необходимо пройти больше одного раза, с разными параметрами. Алиас создается путем присвоения новых имен одной связи, при этом новые имена полностью наследуют свойства связи ('link_aliases').

Возникает необходимость использовать связь несколько раз:

связь используется для соединения с целью ограничения, а также необходимо полное содержимое связи;

по связи необходимо пройти больше одного раза, с разными параметрами.

Алиас создается путем присвоения новых имен одной связи, при этом новые имена полностью наследуют свойства связи ('link_aliases').

Кеширование Если кеш включен, то решение: взять из БД и положить в кеш или взять из кеша, принимается в момент вызова fetch() (учитываем «ленивость») Берем из кеша, если: существуют данные в кеше (есть соотствующий файл на диске); дата создания файла проходит под максимальный «возраст» кеша. Кеш хранит выборку .

Если кеш включен, то решение: взять из БД и положить в кеш или взять из кеша, принимается в момент вызова fetch() (учитываем «ленивость»)

Берем из кеша, если:

существуют данные в кеше (есть соотствующий файл на диске);

дата создания файла проходит под максимальный «возраст» кеша.

Кеш хранит выборку .

Описание связей/кеширования в параметрах конструктора Для перехода по связи никакие параметры не нужны (поведение по умолчанию!) Виды описаний: алиасы связей; параметры связи; соединение: joined; search_joined. prefetch_links; cache.

Для перехода по связи никакие параметры не нужны (поведение по умолчанию!)

Виды описаний:

алиасы связей;

параметры связи;

соединение:

joined;

search_joined.

prefetch_links;

cache.

Параметры: link_aliases 'alias1' и 'alias2' – полноценные альтернативные имена для связи 'link', при этом они могут быть использованы независимо (с разными параметрами, разными способами). 'link_aliases' => array( 'alias1' => 'link', 'alias2' => 'link', ),

'alias1' и 'alias2' – полноценные альтернативные имена для связи 'link', при этом они могут быть использованы независимо (с разными параметрами, разными способами).

'link_aliases' => array( 'alias1' => 'link', 'alias2' => 'link', ),

Параметры: joined 'joined' - нам интересно получить содержимое присоединенного класса (возможно, осуществить и ограничение). при переходе по связям link1, link2 выборки не происходит! присоединение даже без доп. параметров может изменить кол-во элементов выборки! 'joined' => array('link1+', 'link2'), 'link1' => array( 'param' => array('kind' => 57), ),

'joined' - нам интересно получить содержимое присоединенного класса (возможно, осуществить и ограничение).

при переходе по связям link1, link2 выборки не происходит!

присоединение даже без доп. параметров может изменить кол-во элементов выборки!

'joined' => array('link1+', 'link2'), 'link1' => array( 'param' => array('kind' => 57),

),

Параметры: search_joined 'search_joined' - мы не хотим получить содержимое присоединенного класса, нас интересует только ограничение выборки; переход по связи link некорректен! с точки зрения ограничения выборки joined и search_joined эквивалентны, но search_joined подчеркивает цель соединения. 'search_joined' => array('link+'), 'link' => array( 'join_param' => array('mode' => 's'), ),

'search_joined' - мы не хотим получить содержимое присоединенного класса, нас интересует только ограничение выборки;

переход по связи link некорректен!

с точки зрения ограничения выборки joined и search_joined эквивалентны, но search_joined подчеркивает цель соединения.

'search_joined' => array('link+'),

'link' => array( 'join_param' => array('mode' => 's'),

),

Параметры: prefetch_links ' prefetch_links' - мы хотим, чтобы при получении из БД этой выборки был осуществлено получение указанных связей для каждого элемента нашей выборки; это не приведет к изменению выборки, не улучшит работу с ней, может привести к «излишним» выборкам связей; но, если включено кеширование, то содержимое указанных связей попадет в кеш (иначе бы они выбирались отдельными запросами, даже если кеш бы сработал»). 'prefetch_links' => array('link1', 'link2'),

' prefetch_links' - мы хотим, чтобы при получении из БД этой выборки был осуществлено получение указанных связей для каждого элемента нашей выборки;

это не приведет к изменению выборки, не улучшит работу с ней, может привести к «излишним» выборкам связей;

но, если включено кеширование, то содержимое указанных связей попадет в кеш (иначе бы они выбирались отдельными запросами, даже если кеш бы сработал»).

'prefetch_links' => array('link1', 'link2'),

Параметры: cache 'cache' - кеш включается для этой выборки, значение параметра задает имя каталога с кешом (еще есть глобальный выключатель кеширования); всё остальное – забота PGDBObject: хранение выборок с разными параметрами в разных файлах, кеш для разных сайтов (БД, схем) в разных подкаталогах, и т.п.; 'joined'-связи попадут в кеш всегда, все остальные – только если они попали в 'prefetch_links' 'cache' => 'megaquery',

'cache' - кеш включается для этой выборки, значение параметра задает имя каталога с кешом (еще есть глобальный выключатель кеширования);

всё остальное – забота PGDBObject: хранение выборок с разными параметрами в разных файлах, кеш для разных сайтов (БД, схем) в разных подкаталогах, и т.п.;

'joined'-связи попадут в кеш всегда, все остальные – только если они попали в 'prefetch_links'

'cache' => 'megaquery',

Вложенность параметров уровень вложенности – параметры очередной вложенной связи; для каждого уровня справедливы все перечисленные замечания; получаем – кеширование на верхнем и вложенном уровне вложенности; вложенный prefetch_links для полного кеширования уровней; вложенный joined и т.п. 'link1' => array( 'link2' => array( 'link3' => array( ....

уровень вложенности – параметры очередной вложенной связи;

для каждого уровня справедливы все перечисленные замечания;

получаем – кеширование на верхнем и вложенном уровне вложенности; вложенный prefetch_links для полного кеширования уровней; вложенный joined и т.п.

'link1' => array( 'link2' => array( 'link3' => array(

....

Дополнительная информация В wiki можно найти: исторические версии PGDBObject и его предшественников; ссылки на реальные примеры использования упоминаемых в этом докладе возможностей PGDBObject; эту презентацию.

В wiki можно найти:

исторические версии PGDBObject и его предшественников;

ссылки на реальные примеры использования упоминаемых в этом докладе возможностей PGDBObject;

эту презентацию.

Спасибо за внимание! Вопросы?

Add a comment

Related pages

svn.shamangrad.net

... (osp^.PGDBObject).GetObjType=GDBlwPolylineID then fixentities:=true; dist.x := wc.x - t3dp.x; dist.y := wc.y - t3dp.y; dist.z : = wc.z ...
Read more

Foundation. - Docin.com豆丁网-分享文档 发现价值

We developed databasebrowser demon-strates how PGDBobject database can interactive,graphical application. developedspecifically 32-bitMicrosoft Windows ...
Read more

svn.shamangrad.net

unit System; {Этот модуль создан автоматически. НЕ РЕДАКТИРОВАТЬ} interface type //Generate on E:/zcad/cad ...
Read more