298 Часть II. Типовые решения
Принцип действия
Итак, в данном случае структура наследования отображается на одну таблицу, кото-
рая содержит в себе все данные всех классов, входящих в иерархию наследования. Каж-
дому классу (а точнее, его экземпляру) соответствует одна строка таблицы; при этом поля
таблицы, которых нет в данном классе, остаются пустыми. Основное поведение объек-
тов, выполняющих отображение, соответствует общей схеме преобразователей наследова-
ния (Inheritance Mappers, 322).
Выполняя загрузку объекта в память, необходимо знать, в экземпляр какого класса
следует поместить загружаемые данные. Для этого к таблице добавляется специальное
поле, указывающее на то, экземпляр какого класса должен быть создан для загрузки дан-
ного объекта. Это может быть имя класса или какое-нибудь кодовое поле. Для отображе-
ния кодового поля на имя соответствующего класса необходим специальный код, кото-
рый должен быть расширен при добавлении в иерархию нового класса. В свою очередь,
указанное в таблице явное имя класса можно использовать непосредственно для созда-
ния экземпляра этого класса. Следует отметить, что явное имя класса занимает больше
места и является более сложным для обработки при непосредственном использовании
таблиц базы данных. Кроме того, оно теснее привязывает структуру классов к схеме базы
данных.
Перед загрузкой данных необходимо считать код типа класса, чтобы узнать, экземп-
ляр какого производного класса должен быть создан для загрузки объекта. При сохране-
нии объекта в базе данных запись кода типа класса выполняется суперклассом.
Назначение
Типовое решение наследование с одной таблицей является одним из вариантов
отображения иерархии наследования на реляционную базу данных. В число других
возможных вариантов входят наследование с таблицами для каждого класса (Class
Table Inheritance, 305) и наследование с таблицами для каждого конкретного класса
(Concrete Table Inheritance, 313).
Наследование с одной таблицей имеет ряд преимуществ.
• В структуру базы данных добавляется только одна таблица.
• Для извлечения данных не нужно выполнять соединение таблиц.
• Перемещение полей в производный класс или суперкласс не требует внесения из
менений в структуру базы данных.
Несмотря на это, у данного типового решения есть и слабые стороны.
• Не все поля соответствуют содержимому каждого конкретного объекта, что может
приводить в замешательство людей, работающих только с таблицами.
• Некоторые столбцы используются только одним-двумя производными классами,
что приводит к бессмысленной трате свободного места. Критичность данной про
блемы зависит от характеристик конкретных данных, а также от того, насколько
хорошо сжимаются пустые поля. Например, в базах данных Oracle применяется
высокая степень сжатия свободного пространства, особенно если "необязатель
ные" столбцы выносятся в правую часть таблицы. Впрочем, у каждой базы данных
есть свои приемы на этот счет.