Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shablony_korporativnykh_prilozheniy_Fauler_M.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
3.82 Mб
Скачать

Наследование

Выше уже упоминались составные иерархические структуры, которые традиционно плохо отображаются средствами реляционных систем баз данных. Существует и другая разновидность иерархий, еще более усугубляющих страдания приверженцев реляцион­ной модели: речь идет об иерархиях классов, создаваемых на основе механизма наследо­вания (inheritance). Поскольку SQL не предоставляет стандартизованных инструментов поддержки наследования, придется вновь прибегнуть к аппарату отображения. Сущест­вует три основных варианта представления структуры наследования: "одна таблица для всех классов иерархии" (наследование с одной таблицей (Single Table Inheritance)) — рис. 3.8; "таблица для каждого конкретного класса" (наследование с таблицами для каж­дого конкретного класса (Concrete Table Inheritance)) — рис. 3.9; "таблица для каждого класса" (наследование с таблицами для каждого класса (Class Table Inheritance)) — рис. 3.10.

Рис. 3.8. Типовое решение наследование с одной таблицей предусматривает сохранение значений атрибутов всех классов иерархии в одной таблице

Возможен компромисс между необходимостью дублирования элементов данных и по­требностью в ускорении доступа к ним. Решение наследование с таблицами для каждого класса — самый простой и прямолинейный вариант соответствия между классами и таб­лицами базы данных, но для загрузки информации об отдельном объекте в этом случае приходится осуществлять несколько операций соединения (join), что обычно сопряжено со снижением производительности системы. Решение наследование с таблицами для каж­дого конкретного класса позволяет обойти соединения, предоставляя возможность считы­вания всех данных об объекте из единственной таблицы, но существенно препятствует внесению изменений. При любой модификации базового класса нельзя забывать о необ­ходимости соответствующего преобразования всех таблиц дочерних классов (и кода, обеспечивающего корректное отображение). Изменение самой иерархической структуры способно вызвать еще более серьезные проблемы. Помимо того, отсутствие таблицы для базового класса может усложнить управление ключами. Что касается наследования с одной таблицей, то самым большим недостатком этого решения является нерациональное рас­ходование дискового пространства, поскольку каждая запись таблицы содержит поля для атрибутов всех созданных дочерних классов и многие из этих полей остаются пустыми.

Рис. 3.9 Типовое решение наследование с таблицами для каждого конкретного класса предусматривается использование отдельных таблиц для каждого конкретного класса иерархии.

Рис. 3.10. Типовое решение наследование с таблицами для каждого класса предусматривает использование отдельных таблиц для каждого класса иерархии

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

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

Среди названных способов отображения иерархии наследования трудно выделить ка­кой-либо один. Как и при использовании всех других типовых решений, необходимо принять во внимание конкретные обстоятельства и требования. Моим первым выбором был бы вариант наследования с одной таблицей как наиболее простой в реализации и ус­тойчивый к многочисленным модификациям, а двумя другими я пользовался бы по мере необходимости, чтобы избавиться от неподходящих или заведомо лишних полей. Лучше всего, однако, побеседовать с администратором базы данных, знакомым со всеми ее ню­ансами и тонкостями, и прислушаться к советам, которые он вам даст.

Здесь и далее в примерах и типовых решениях подразумевается модель единичного на­следования (single inheritance). Сегодня парадигма множественного наследования (multiple inheritance) теряет популярность и во многих языках все чаще изымается из обихода. При использовании интерфейсов Java и .NET проблемы, сопутствующие применению инст­рументов множественного наследования, все еще о себе напоминают. В обсуждаемых здесь типовых решениях подобные аспекты специально не оговариваются. Впрочем, дос­таточно сказать, что поладить с отображением иерархий множественного наследования вам поможет "трио" решений, рассмотренных выше. Наследование с одной таблицей предполагает размещение атрибутов всех базовых классов и интерфейсов в одной боль­шой таблице, при использовании наследования с таблицами для каждого класса создаются таблицы для каждого интерфейса и суперкласса, а реализация наследования с таблицами для каждого конкретного класса связана с включением данных обо всех базовых классах и интерфейсах в каждую таблицу конкретного класса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]