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