Интеграция баз данных с различными моделями данных с использованием CORBA.

Автор: Кравченко Д.В.

Содержание

  1. Универсальный протокол доступа к данным.
  2. Устройство адаптеров баз данных.
  3. Клиентское приложение.
  4. Заключение.

Для демонстрации трехуровневой архитектуры доступа к базам данных с использованием ПО промежуточного уровня была создана система, состоящая и следующих частей:

Универсальный протокол доступа к данным.

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

Интерфейс определен в виде IDL-модуля, содержащего IDL-интерфейсы и IDL-структуры. Основным IDL-интерфейсом является Database, который используется для получения метаинформации и данных:

interface Database
{
SchemaInfo getSchemaInfo() raises (ServerException);
ObjectIdSeq getObjectIds(in string obTyName) raises (ServerException);
ObjectValue getObjectValue(in ObjectId obId) raises (ServerException);
};
Операция getSchemaInfo() возвращает в качестве результата структуру SchemaInfo,содержащую описание схемы:
struct SchemaInfo
{
string name; // имя схемы
string longName; // имя схемы для пользователя
sequence objectTypeInfos;
};
Схема содержит множество объектных типов, каждый из которых описывается структурой ObjectTypeInfo:
struct ObjectTypeInfo
{
string name; // имы типа
string longName;
sequence attributeInfos;
sequence singleRoleInfos;
sequence multiRoleInfos;
};
В объектном типе могут быть определены атрибуты, которые имеют встроенный тип, например, целый, строковый и т.п. Атрибут описывается в структуре AttributeInfo:
struct AttributeInfo
{
string name;
string longName;
string type;
};
В объектном типе также могут быть определены роли, которые имеют тип ссылки на объектный тип или тип множества ссылок на объектный тип. В первом случае роль описывается при помощи структуры SingleRoleInfo, во втором - помощи структуры MultiRoleInfo:
struct SingleRoleInfo
{
string name;
string longName;
string type;
};
struct MultiRoleInfo
{
string name;
string longName;
string type;
};
В структуре ObjectTypeInfo задается информация обо всех атрибутах и ролях - как унаследованных, так и определенных непосредственно в типе. Операция Database::getObjectIds() в качестве результата возвращает множество объектных идентификаторов, соответствующих объектам объектного типа, имя которого задано в качестве аргумента операции. Объектный идентификатор представлен в виде структуры ObjectId:
struct ObjectId
{
string key; // уникальный ключ, по которому однозначно определяется объект
string objectName; // имя объекта для представления пользователю 
string className; // имя объектного типа
};
Операция Database::getObjectValue() в качестве результата возвращает значение объекта, идентификаиор которого задается при помощи параметра операции. Значение объекта представляется в виде структуры ObjectValue:
struct ObjectValue
{
sequence attributes;
sequence singleRoles;
sequence multiRoles;
};
Значения атрибутов и ролей передаются в том же порядке, в котором были заданы описания атрибутов и ролей в структуре ObjectTypeInfo. Для представления значений атрибутов и ролей используются структуры AttributeValue,SingleRoleValue и MultiRoleValue:
struct AttributeValue
{
string name; // имя атрибута
string value; // значение атрибута (для упрощения используется
              // представление значения в виде строки)
};
struct SingleRoleValue
{
string name; // имя роли
string value; // значение роли - название объекта
};
struct MultiRoleValue
{
string name; // имя роли
sequence value; // значение роли - множество объектных идентификаторов
};

Устройство адаптеров баз данных.

Адаптер базы данных - это компонент, реализующий универсальный протокол доступа к данным. Т.о. адаптер позволяет клиентским приложениям получить доступ к схеме и содержимому конкретной базы данных. Адаптер должен содержать реализацию интерфейса Database.

Реализация адаптера может зависеть или не зависеть от схемы базы данных - это определяется протоколом доступа к (мета)данных, который предлагает СУБД. Независимость от схемы не означает, что адаптер способен поддержать любую схему: метамодель для описания схемы должна быть совместимой с метамоделью, заданной в универсальном протоколе доступа.

Базовый адаптер.

Базовый адаптер - это частичная реализация интерфейса Database, которая может использоваться как базис для реализации конкретных адаптеров.

Oracle-адаптер.

Данный адаптер обеспечивает доступ к любой базе данных, управляемой ОРСУБД Oracle, модель данных которой совместима с моделью, заданной в универсальном протоколе. Реализация данного адаптера не зависит от схемы, т.к. использует JDBC для связи с базой данных.

Схема тестовой базы данных использует наследование, которое отсутствует в Oracle. Эта проблема решается способом, описанном ниже. Для каждого объектного типа создается объектный тип Oracle, в котором помимо атрибутов, определенных в исходном объектном типе, добавлены нижеописанные сущности.

Для каждого объектного типа создаётся своя объектная таблица. Процесс создания объекта заключается в следущем:
  1. генерируется уникальное значение ключа;
  2. создаётся множество частей объекта, соответствующих рефлексивно-транзитивным супертипам исходного типа;
  3. части объекта заносятся в соответствующие объектные таблицы;
  4. соответствующим образом инициализируются ссылки.
Все части одного объекта должны иметь одно и то же уникальное значение ключа, которое является составной частью идентификатора объекта.

Описанный выше способ позволяет эмулировать множественное наследование в Oracle. В запросах необходимо использовать методы чтения, а не атрибуты.

PSE-адаптер.

Данный адаптер обеспечивает доступ к базам данных под управлением ObjectStore PSE for Java. Реализация данного адаптера является наиболее простой, но зависит от схемы.

Адаптер виртуальной базы данных.

Данный адаптер обеспечивает доступ к виртуальной базе данных, которая образуется путем объединения нескольких баз данных (возможно тоже виртуальных). Для доступа к ресурсным базам данных используется универсальный протокол. Реализация данного адаптера не зависит от схемы. Данный адаптер нуждается в описании результирующей схемы виртуальной базы данных, и в описании того как из объекта ресурсного типа получить объект виртуальной базы данных. Эта информация передается адаптеру в качестве параметра.

Данный адаптер реализует простейший вид интеграции данных - объединение баз данных: каждому ресурсному объекту соответствует один "виртуальный" объект, и наоборот, каждому "виртуальному" объекту соответствует один ресурсный объект. Несколько объектных типов из разных схем могут отображаться в один "виртуальный" объектный тип, т.о. происходит объединение экстенсионалов типов.

"Виртуальные" объекты существуют временно: они создаются только в реализации операции Database::getObjectValue(). Идентификтор "виртуального" объекта включает в себя информацию о том, из какой базы данных получен его прообраз, а также объектный идентификтор объекта-прообраза, т.о. адаптер может определить к какому адаптеру следует обратиться для получения значения ресурсного объекта.

Клиентское приложение.

Клиентское приложение использует универсальный протокол доступа и позволяет пользователю просматривать содержимое баз данных. Клиентское приложение релизовано на Java с использованием Swing, библиотеки для создания пользовательского интерфейса.

В системе может быть несколько серверных приложений, каждое из которых может содержать один или несколько адаптеров для различных баз данных. При инициализации адаптер регистрируется в CORBA Naming Service.

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

Графический интерфейс устроен следующим образом: в окне приложения есть две панели, левая панель содержит графический элемент управления в виде дерева, в котором узлами первого уровня являются базы данных; второй уровень - объектные типы, присутствующие в схеме базы данных; третий уровень занимают объекты соответствующего типа в соответствующей базе данных.

Когда пользователь выбирает какой-либо объект, в правой панели появляется форма, в которой отображаются значения атрибутов и ролей выделенного объекта. Формы не предназначены для изменения данных, поэтому в них используются лишь графические элементы типа JLabel и списки (JList).

Т.к. клиент использует универсальный протокол доступа, то его реализация не зависит от конкретных схем баз данных, т.е. клиент настраивается динамически на определённую схему.

Заключение.

В данном документе описан один из подходов к интеграции баз данных с различными моделями данных.

В системе, где возможно, используются компоненты, не зависящие от конкретной схемы, например:

Использование языка Java для реализации клиента и адаптеров обеспечивает переносимость, а использование CORBA позволяет, в принципе, реализовывать различные части системы на разных языках программирования, хотя эта возможность не использовалась в тестовой системе.

В документе также описан подход как обходить некоторые ограничения (отсутствие наследования) в существующей объектно-реляционной технологии в СУБД Oracle8.

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