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 для получения более подробной информации.