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