Определение наследования

Понятие наследования в PostgreSQL происходит от аналогичного понятия в объектно-ориентированном программировании, однако имеет свои особенности, связанные именно с тем, что мы имеем дело с конкретными таблицами, наполненными конкретными данными.

Допустим, что у нас есть некоторая простая БД, описывающая ассортимент некоторого магазина электроники.
Создадим простую таблицу, описывающую имеющиеся в наличии DVD-плееры.

CREATE TABLE dvd (
	id integer,
	maker varchar, 
	model varchar, 
	price money);

Предположим, что нам нужно создать ещё одну таблицу, в которую будут внесены уже домашние кинотеатры. Так как любой современный домашний кинотеатр заведомо включает в себя DVD-плеер, то получается, что в таблице, описывающей домашние кинотеатры, заведомо должны иметься четыре поля, аналогичные тем, которые характеризуют DVD, плюс поля, специфичные именно для домашних кинотеатров. В нашем случае мы можем ввести поле, в котором будет храниться количество компонент акустики.

Можно попробовать действовать в лоб:

CREATE TABLE home_cinema (
	id integer,
	maker varchar, 
	model varchar, 
	sound integer,
	price money);

Вроде как все отлично. Таким же образом можно создать аналогичные таблицы portable_dvd и car_dvd, описывающие соответственно портативные и автомобильные DVD-плееры. В их составе будут как и общие для всех видов DVD-плееров поля, так и специфичные для каждого типа.

Предположим теперь, что наша БД должна теперь использоваться не только для внутренних нужд самого магазина, теперь она используется для работы интернет-магазина с таким же ассортиментом. Соответственно, в исходной таблице dvd появятся новые поля supported_formats и description, представляющие соответственно битовую маску для описания поддерживаемых плеером форматов и краткую текстовую характеристику модели для потенциального покупателя.
Вот тут и возникает неудобство. Вместо одной таблицы dvd у нас теперь четыре и в каждую нужно вносить изменения. Вроде как ерунда... А если предположить вместо нашей игрушечной БД реальную рабочую с гораздо большим количеством таблиц, полей и содержащихся данных?

Вот теперь на сцену и выходит наследование (inheritance) со всеми его преимуществами и недостатками. Благодаря ему мы можем мы можем объединить нужные нам таблицы в некую иерархию, в которой таблица-потомок будет уже априорно содержать все поля таблицы-предка, без необходимости их явного указания.
Вернемся к тому моменту, когда мы собирались создавать таблицу home_cinema. Сделаем теперь это по-умному, а именно - объявим эту таблицу как потомка таблицы dvd:

CREATE TABLE home_cinema (
	sound integer)
	INHERITS (dvd);

Теперь если мы добавим новые поля к родительской таблице dvd или изменим существующие, то внесенные в её структуру изменения сразу же отразятся на таблице-потомке home_cinema. Аналогичным образом объявляются и две другие таблицы - portable_dvd и car_dvd

Back to top

(С) Виктор Вислобоков, 2008-2023