Наследование — это концепция объектно-ориентированных баз данных. Это открывает интересные новые возможности проектирования баз данных.
Создадим две таблицы: Таблица 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 комментариев