Наследование представляет собой концепцию, заимствованную из объектно-ориентированных баз данных. Данный механизм открывает новые возможности для проектирования баз данных.
Создадим две таблицы: таблицу cities
и таблицу capitals. Поскольку столицы также являются городами, требуется способ неявного включения данных о столицах при обращении к списку всех городов. Для решения этой задачи можно
использовать следующую схему:
CREATE TABLE capitals (
name text,
population real,
elevation int, -- (in ft)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
elevation int -- (in ft)
);
CREATE VIEW cities AS
SELECT name, population, elevation FROM capitals
UNION
SELECT name, population, elevation FROM non_capitals;
Этот подход приемлем для выполнения запросов, однако он становится неудобным, когда, помимо прочего, требуется обновить несколько строк одновременно.
Более эффективным решением является следующий механизм:
CREATE TABLE cities ( name text, population real, elevation int -- (in ft) ); CREATE TABLE capitals ( state char(2) UNIQUE NOT NULL ) INHERITS (cities);
В данном случае строка таблицы capitals
наследует все столбцы (name,
populationи elevation) от своего
родительского элемента, cities. Тип
данного столбца — name —
text, встроенный Digital Q.DataBase
тип для символьных строк переменной длины. В
capitals таблице имеется
дополнительный столбец state, в котором указывается аббревиатура штата. В
Digital Q.DataBase, таблица может наследоваться от
нуля или более других таблиц.
Например, следующий запрос позволяет получить названия всех городов, включая столицы штатов, которые расположены на высоте более 500 футов:
SELECT name, elevation FROM cities WHERE elevation > 500;
который возвращает:
name | elevation -----------+----------- Лас-Вегас | 2174 Mariposa | 1953 Madison | 845 (3 rows)
С другой стороны, следующий запрос находит все города, не являющиеся столицами штатов, которые расположены на высоте более 500 футов:
SELECT name, elevation
FROM ONLY cities
WHERE elevation > 500;
name | elevation -----------+----------- Лас-Вегас | 2174 Mariposa | 1953 (2 rows)
В данном случае ключевое слово ONLY перед именем таблицы cities
указывает на то, что запрос должен быть выполнен только в отношении указанной
cities таблицы, исключая таблицы, находящиеся ниже
cities в иерархии наследования. Многие
из ранее рассмотренных команд —
SELECT, UPDATEи
DELETE — поддерживают использование данного ONLY
синтаксиса.
Несмотря на то, что механизм наследования часто оказывается полезным, он не интегрирован с ограничениями уникальности и внешними ключами, что ограничивает его функциональность. Подробную информацию см. в разделе Раздел 2.2.11 for more detail.