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