3.6. Наследование
Наследование — это концепция, взятая из объектно-ориентированных баз данных. Она открывает множество интересных возможностей при проектировании баз данных.
Давайте создадим две таблицы: cities
(города) и capitals
(столицы штатов). Естественно, столицы штатов также являются городами, поэтому нам нужно явным образом добавлять их в результат, когда мы хотим просмотреть все города. Если вы проявите смекалку, вы можете предложить, например, такое решение:
CREATE TABLE capitals ( name text, population real, elevation int, -- (высота в футах) state char(2) ); CREATE TABLE non_capitals ( name text, population real, elevation int -- (высота в футах) ); 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 -- (высота в футах) ); CREATE TABLE capitals ( state char(2) UNIQUE NOT NULL ) INHERITS (cities);
В данном случае строка таблицы capitals
наследует все столбцы (name
, population
и elevation
) от родительской таблицы cities
. Столбец name
имеет тип text
, собственный тип Postgres Pro для текстовых строк переменной длины. А в таблицу capitals
добавлен дополнительный столбец state
, в котором будет указан буквенный код штата. В Postgres Pro таблица может наследоваться от ноля или нескольких других таблиц.
Например, следующий запрос выведет названия всех городов, включая столицы, находящихся выше 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.
51.33. pg_opclass
The catalog pg_opclass
defines index access method operator classes. Each operator class defines semantics for index columns of a particular data type and a particular index access method. An operator class essentially specifies that a particular operator family is applicable to a particular indexable column data type. The set of operators from the family that are actually usable with the indexed column are whichever ones accept the column's data type as their left-hand input.
Operator classes are described at length in Section 37.16.
Table 51.33. pg_opclass
Columns
Column Type Description |
---|
Row identifier |
Index access method operator class is for |
Name of this operator class |
Namespace of this operator class |
Owner of the operator class |
Operator family containing the operator class |
Data type that the operator class indexes |
True if this operator class is the default for |
Type of data stored in index, or zero if same as |
An operator class's opcmethod
must match the opfmethod
of its containing operator family. Also, there must be no more than one pg_opclass
row having opcdefault
true for any given combination of opcmethod
and opcintype
.