Объектно-реляционное отображение При проектировании информационных систем с использованием ОРСУБД возникает задача реализации объектно-ориентированного отображения. Существует два способа решения этой проблемы, часто называемых "сверху вниз" и "снизу вверх".
Основная идея метода "сверху вниз" состоит в том, чтобы начать с объектной модели, после чего от нее производится реляционная схема хранения данных, то есть, ставится задача сохранения объектов в реляционных таблицах.
Метод "сверху вниз" позволяет сосредоточиться на логике приложения, например, для описания общей объектной модели. При этом особое внимание уделяется тому, что производная реляционная схема хранения данных проектируется так, чтобы обеспечить производительность и целостность данных. Возможность использовать простое отображение "один-к-одному" между классами и таблицами существует далеко не всегда. Очень часто схему объектных данных нужно адаптировать под специфику реляционного мира. Например, никогда нельзя забывать о нормализации. Однако слишком высокая нормализация приводит к низкой производительности, сильно фрагментированным схемам данных и чрезмерной сложности. По этой причине излишне высокой нормализации (выше 3НФ) все разработчики стараются избегать.
Метод "снизу вверх" начинает с реляционной схемы хранения данных, от которой производит объектную модель, что позволяет в дальнейшем осуществлять доступ к реляционным таблицам с помощью объектов. Этот метод используется достаточно часто в тех случаях, когда реляционная схема данных уже существует, а вносить изменения в нее крайне нежелательно. В подобных случаях проводится анализ реляционной схемы, после чего предпринимается попытка произвести от этой схемы объектную модель, которая бы отражала, с одной стороны, логику приложения, а с другой — собственно реляционную схему. Достижение подобных результатов может оказаться достаточно сложной задачей в случае нормализованной реляционной схемы. В подобных ситуациях возникает необходимость отобразить несколько таблиц на один класс, благодаря чему один экземпляр объекта представляет несколько строк с данными. Очень часто этот метод называется упаковкой, поскольку один класс содержит несколько таблиц.
Отображение классов на таблицы.Рассмотрим способы отображения классов на таблицы подробнее.
Основная идея объектно-ориентированного отображения достаточно проста:
· классы отображаются на таблицы,
· создаваемые объекты данного класса представляются в виде строк, а атрибуты объектов — в виде столбцов реляционной таблицы.
Основная схема объектно-ориентированного отображения приведена на рис.39.
Наследование
Реляционная модель не предполагает наследования. Таким образом, отображение иерархии наследования объектной модели на реляционную схему является достаточно непростым заданием. Существует несколько способов отображения наследования на уровне объектной модели на реляционную модель, рассмотренных ниже, каждый из которых обладает определенными преимуществами и недостатками.
Рис.39. Основная схема объектно-ориентированного отображения
Пример. Пусть имеется следующая иерархия классов, представленная на рис.40.
Рис.40. Пример иерархии наследования
Горизонтальное разделение
Горизонтальное разделение поддерживает множественное наследование. Именам столбцов могут предшествовать имена классов, для которых первоначально были определены атрибуты. Горизонтальное разделение обеспечивает отображение, поддерживающее простую идею отобрази-каждый-класс-на-таблицу, а также обеспечивает приемлемую производительность операций манипулирования строго типизированными данными. Пример, приведенный на рис.41., иллюстрирует, как выглядит горизонтальное разделение для базового классаАкция с двумя потомками ВариантиПредпочтительная акция.Запрос на получение сведений обо всех объектах предпочтительных акций требует одного простого запроса, который вернет целую коллекцию данных, в частности SQL-вызов
SELECT * FROM Предпочтительная акция
Однако горизонтальное разделение обладает и целым рядом недостатков. При внесении изменений в один из абстрактных базовых или конкретных классов, находящихся в основании графа наследования, например, добавления нового атрибута, претерпят изменения все конкретные классы или таблицы, наследующие от этого класса, С этой точки зрениякаждый запрос требуетосуществления запросов к нескольким таблицам,результаты которыхагрегируются. Например, для того чтобы извлечь все объектыАкция,нам необходимо провести три отдельных SQL-запроса SELECT; первый для извлечения всех экземпляров Акция,второй для извлечения всех экземпляров Варианти третий — для извлечения всехэкземпляров Предпочтительная акция.Все полученные результаты затем объединяются для получения унифицированной коллекции, содержащей сведения обо всех акциях. Конечно, повысить эффективность подобных запросов можно, используя оптимизацию, основанную на специфике реляционных способов отображения, которые бы расширяли возможности схемы горизонтального разделения,.
Вертикальное разделение
Каждый производный класс отображается на новую таблицу, содержащую атрибуты, которые определены только для этого класса. Помимо этого, каждая таблица содержит внешний ключ, указывающий на таблицу базового класса. Множественное наследование поддерживается путем включения нескольких внешних ключей в таблицу производного класса. Расширения и изменения очень легко добавить по мере необходимости в одну и ту же таблицу. Однако любой запрос на извлечение экземпляров производного класса или таблицы требует как минимум одного соединения, а в случаях глубокой иерархии наследования — даже нескольких соединений. Все это сказывается на производительности всех операций, манипулирующих данными (вставка, запрос, обновление и удаление). Пример метода вертикального разделения приведен на рис.42.
Унификация
Все абстрактные и конкретные классы в рамках одной ветви иерархии отображаются на одну таблицу. Для идентификации типа каждой строки используется дополнительный столбец, называемый дискриминатором типа. Во многих случаях в этих целях может использоваться имя реального класса. Такой способ отображения не совсем соответствует правилам нормализации. Следовательно, таблицы могут быть очень слабо заполненными, особенно » том случае, если один дочерний класс характеризуется большим количеством атрибутов. Такой вариант отображения оказывается наиболее выгодным при использовании абстрактных родительских классов; это означает, что не существует реальных экземпляров абстрактных классов, несмотря на то, что все определенные для них атрибуты содержатся во всехна следующих классах. Пример метода унификации приведен на рис.43.
Рис.41. Горизонтальное разделение
Рис. 42. Вертикальное разделение
|