3.6. Наследование#

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

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

Наследование - это концепция из объектно-ориентированных баз данных. Она открывает интересные новые возможности проектирования баз данных.

Давайте создадим две таблицы: таблицу 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, это встроенный тип Tantor SE для строк переменной длины. В таблице capitals есть дополнительный столбец state, в котором указано сокращенное обозначение соответствующего штата. В Tantor SE таблица может наследовать параметры от ноля или нескольких других таблиц.

Например, следующий запрос находит названия всех городов, включая столицы штатов, которые находятся на высоте более 500 футов:

SELECT name, elevation
  FROM cities
  WHERE elevation > 500;

и возвращает:

   name    | elevation
-----------+-----------
 Las Vegas |      2174
 Mariposa  |      1953
 Madison   |       845
(3 rows)

А следующий запрос находит все города, которые не являются столицами штатов и расположены на высоте более 500 футов:

SELECT name, elevation
    FROM ONLY cities
    WHERE elevation > 500;

   name    | elevation
-----------+-----------
 Las Vegas |      2174
 Mariposa  |      1953
(2 rows)

Здесь ONLY перед cities указывает, что запрос выполняется только над таблицей cities, а не над таблицами ниже cities в иерархии наследования. Многие из команд, о которых мы уже говорили — SELECT, UPDATE и DELETE — поддерживают указание ONLY.

Примечание

Хотя наследование часто полезно, оно не интегрировано с уникальными ограничениями или внешними ключами, что ограничивает возможности его применения. См. Раздел 5.10 для получения более подробной информации.