Смекни!
smekni.com

Язык описания информационных моделей EXPRESS (стр. 7 из 9)

В заключение отметим, что приведенная схема достаточно удобна для реализации промежуточного объектно-реляционного слоя в рамках схемо-независимой и смешанной стратегий непосредственно средствами реляционной СУБД. Вместе с тем, возможен ряд ее модификаций, связанных с иными способами реляционного представления метамодели EXPRESS путем использования альтернативных паттернов отображения прикладных объектно-ориентированных моделей, рассмотренных выше.


7. Реализация промежуточного объектно-реляционного слоя в

среде Oracle 9

В настоящее время в рамках проекта создания программной платформы для интеграции приложений ведется разработка промежуточного объектно-реляционного слоя общего назначения. Объектно-реляционный слой предназначен для работы с произвольными прикладными объектно-ориентированными данными, модели которых описаны на языке EXPRESS.

Для интегрируемых приложений объектно-реляционный слой предоставляет программные объектно-ориентированные интерфейсы доступа к прикладным данным на некоторых популярных языках реализации). Организация этих интерфейсов следует перечисленным выше принципам прозрачного манипулирования хранимыми данными, декларируемым Манифестом объектно-ориентированных баз данных. Интерфейсы предоставляют функционально развитый набор операций для манипулирования хранимыми и временными объектами, включая операции создания, модификации, удаления объектов, навигации по их однонаправленным и двунаправленным ассоциативным связям и выборки объектов на основе языка запросов. Запросы базируются на конструкции QUERY языка EXPRESS, позволяющей задать произвольный предикат на множестве объектов и отобрать те из них, которые удовлетворяют условию данного предиката. Интерфейсы предусматривают несколько пессимистических и оптимистических моделей транзакций с различными способами изоляции на уровне отдельных прикладных объектов и самостоятельных объектных популяций, содержательных для коллективных пользовательских сессий и участвующих в них приложений.

По спецификации данные интерфейсы совместимы с соответствующими частями международного информационного стандарта по интероперабельности STEP и поэтому обеспечивают интегрируемость широкого класса унаследованных и вновь создаваемых программных систем научного и промышленного назначения.

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

Важнейшими функциями, реализуемыми непосредственно средствами реляционной СУБД, являются операции манипулирования хранимыми объектами и выполнения простых объектных запросов. С этой целью на языке PL/SQL разрабатываются пакеты программ, эмулирующие объектно-ориентированные интерфейсы доступа к данным путем предоставления функциональных средств для создания, модификации, поиска и удаления объектов. Поскольку полная поддержка объектного языка запросов средствами реляционной СУБД представляется проблематичной с учетом разнообразия императивных конструкций языка EXPRESS, пакеты программ выполняют простейшие виды запросов на основе хранимых объектных идентификаторов (PID), объектных типов и навигационных маршрутов в виде графов переходов по ассоциативным связям типизированных объектов. Поддерживая кэширование объектов, посредник в ряде случаев разрешает запросы самостоятельно, а иногда переадресовывает их реляционной СУБД. При этом происходит редукция клиентского запроса, представленного в общей форме, к запросу упрощенного вида, расширяющего множество объектов и выполнимого пакетом программ реляционной СУБД. Результаты затем обрабатываются посредником с целью исключения объектов, полученных в результате интерпретации упрощенного запроса и не удовлетворяющих исходному.

Поскольку выбор стратегии отображения для реализации объектно-реляционного слоя подобной функциональности крайне неоднозначен с учетом разнообразия потенциальных приложений, предполагается реализация и поддержка нескольких альтернативных стратегий, а именно: схемо-независимого, схемо-зависимого и BLOB подходов. Они базируются на тех или иных сочетаниях рассмотренных выше паттернов ОР отображения и используют собственные пакеты программ на PL/SQL для реализации базовой функциональности объектно-реляционного слоя. Хотя все пакеты реализуют семантически эквивалентные наборы операций для манипулирования объектами и их поиска, их внешние интерфейсы не допускают унификацию в силу ограниченных возможностей языка SQL при формировании клиентских запросов со стороны объектно-реляционного посредника для специфических реляционных схем представления объектно-ориентированных моделей данных. Для адаптации посредника к иным объектно-реляционным стратегиям в его архитектуре предусмотрены специальные компоненты-адаптеры, обеспечивающие требуемую виртуализацию хранилищ данных. Каждый адаптер реализуется с учетом специфики конкретного ОР отображения.

В качестве целевой платформы реализации промежуточного объектно-реляционного слоя выбрана СУБД Oracle9.

7.1 Схемо-независимая стратегия

Разработанная схемо-независимая стратегия состоит в применении обобщенных паттернов AllClasses–OneTable, Attribute–Table, GenericAssociation, GenericSelect, GenericAggregate для отображения схем, классов и атрибутов, а также паттерна представления соответствующих метаданных прикладной модели реляционными таблицами.

Реализованные в среде Oracle9 PL/SQL пакеты обеспечивают выполнение всего базового набора операций с хранимыми объектно-ориентированными данными и запросов к ним. Обобщенная, независимая от конкретных прикладных моделей реализация PL/SQL процедур и функций основана на совместном одновременном использовании данных и метаданных, хранимых в системах таблиц в соответствии с перечисленными паттернами отображения. Приведем описание основных пакетных методов для объектно-реляционного отображения в качестве иллюстрации схемо-независимой стратегии.

Пакет lb_defined_types для работы с метаинформацией о пользовательских типах данных, определенных EXPRESS схемой:

· procedure Register_Defined_Type – регистрация в базе данных пользовательского типа схемы;

· procedure Save_Enum_Type – сохранение метаданных для перечислимого типа;

· procedure Save_Select_Type – сохранение метаданных для селективного типа;

· procedure Save_Aggregate_Type – сохранение метаданных для агрегатного типа;

· function Get_Type – выдача метаинформации о пользовательском типе данных.

Пакет lb_entity предназначен для работы с метаинформацией, относящейся к объектным типам EXPRESS схемы:

· function Register_Entity – регистрация объектного типа схемы;

· procedure Save_Attribute – сохранение метаданных для атрибута, определяемого в регистрируемом объектном типе;

· procedure Save_Inheritance_Relations – сохранение информации о подтипах и супертипах регистрируемого объектного типа;

· function Add_Entity_From_Schema – экспортирование информации об объектном типе из другой схемы;

· function Get_Entity – выдача метаинформации об объектном типе;

· function Get_Attribute – выдача метаинформации об атрибуте, определяемом в объектном типе схемы.

Пакет lb_instance предназначен для работы с данными: занесения данных в базу, а также для извлечения данных из нее на основе запросов:

· function Init_Instance – инициация сохранения объекта;

· procedure Init_Attribute_List – инициация сохранения значений атрибутов объекта;

· procedure Put_Simple_Attribute_{R, I, S, B, L, E} – сохранение значения атрибута вещественного, целочисленного, символьного, бинарного, логического, перечислимого типа, соответственно;

· procedure Put_Association – сохранение значения атрибута ассоциативного типа;

· function Put_Aggregate – инициация сохранения элементов агрегата;

· function Put_Select – инициация сохранения селективного элемента;

· procedure Put_Element_{R, I, S, B, L, E} – сохранение значения элемента агрегатной или селективной конструкции вещественного, целочисленного, символьного, бинарного, логического, перечислимого типа, соответственно;

· procedure Get_Instances_By_ID – выборка объектов по заданным идентификаторам;

· procedure Get_Instances_By_Type – выборка объектов по заданному типу;

· procedure Get_Instances_By_Route – выборка объектов по заданному навигационному маршруту;

· procedure Add_Route_Path – метод формирования навигационного маршрута;

· procedure Get_All_Instances – выборкавсехобъектов;

· procedure Delete_Instances – удаление объектов по заданным идентификаторам.

До начала работы с прикладными данными соответствующие таблицы метаданных должны быть проинициализированы. С этой целью разработан CASE инструмент, позволяющий автоматически сгенерировать скрипт инициализации соответствующих таблиц на языке PL/SQL по заданной EXPRESS спецификации прикладной модели. Фрагмент данного скрипта для информационной схемы ActorResource представлен ниже.

declarel_Sch_IDSchemas.sch_id%TYPE;l_Ent_ID Entities.ent_id%TYPE;begin… lb_defined_types.register_defined_type ('Label','string',l_Sch_ID); lb_defined_types.register_defined_type ('ActorRole','Label',l_Sch_ID); lb_defined_types.register_defined_type ('AddressTypeEnum','enumeration',l_Sch_ID); lb_defined_types.save_enum_type('OFFICE'); lb_defined_types.save_enum_type('HOME'); lb_defined_types.save_enum_type('USERDEFINED'); l_Ent_ID := lb_entity.register_entity ('Organization',l_Sch_ID,false); lb_entity.save_attribute('Id','integer',1,'','',0,'E'); lb_entity.save_attribute('Name','Label',2,'','',0,'E'); lb_entity.save_attribute ('Description','string',3,'','',1,'E'); lb_entity.save_attribute ('Roles','aggregate',4,'','',0,'E'); lb_entity.save_attribute ('Addresses','aggregate',5,'','',0,'E'); lb_entity.save_attribute ('IsRelatedBy','OrganizationRelationship', 6,'OrganizationRelationship','RelatedOrganizations',0,'I'); lb_entity.save_attribute ('Relates','OrganizationRelationship', 7,'OrganizationRelationship','RelatingOrganization',0,'I'); lb_entity.save_attribute ('Engages','Person',8,'Person','EngagedIn',0,'I'); l_Ent_ID := lb_entity.register_entity ('Address',l_Sch_ID,false); lb_entity.save_attribute ('Purpose','AddressTypeEnum',1,'','',0,'E'); lb_entity.save_attribute ('UserDefinedPurpose','string',2,'','',1,'E'); lb_entity.save_attribute ('OfPerson','Person',3,'Person','Addresses',0,'I'); lb_entity.save_attribute ('OfOrganization','Organization', 4,'Organization','Addresses',0,'I'); l_Ent_ID := lb_entity.register_entity ('PostalAddress',l_Sch_ID,false); lb_entity.save_inheritance_relations('Address',false); lb_entity.save_attribute ('AddressLines','aggregate',1,'','',0,'E');…end;

При непосредственной работе с данными адаптер схемо-независимой стратегии осуществляет динамическую трансляцию базовых операций манипулирования объектами того или иного типа в соответствующую последовательность вызовов PL/SQL функций и процедур. На следующем примере можно проследить логику генерации подобных последовательностей. Аналогичным образом реализуются операции модификации, удаления и поиска объектов на основе хранимых идентификаторов, объектных типов и маршрутов навигации.