Частенько возникает такой вопрос, что у нас уже есть некоторая БД и нам необходимо внести в неё какие-то дополнительные зависимости, чтоб её структурировать. Обычно при этом обнаруживается масса "приятных" вещей вроде несовпадения типов и тому подобного. Однако от этого никуда не деться - большинство дополнительных требований к БД возникает уже в процессе её использования, поэтому частенько приходится резать по-живому...
Не обойтись без этого и при создании иерархии таблиц с помощью наследования.
Вроде все DVD-плееры разнообразных калибров мы привели в порядок с помощью четырех таблиц. Однако тут же обнаружилось, что в магазине нашем намного более широкая специализация, чем только DVD и домашние кинотеатры. Однако каким образом вписать в такую красивую и понятную иерархию таблицу tv
, содержащую, как легко догадаться, записи о имеющихся в наличии телевизорах - совершенно неясно.
После долгих и мучительных раздумий возникает мысль, что все позиции в магазине изначально являются представителями некоторого абстрактного объекта, который никогда и нигде на прилавках не лежал - а именно, просто товара, который можно охарактеризовать его артикулом id
и ценой price
. Соответственно, у нас получится некоторая таблица item
:
CREATE TABLE item ( id SERIAL NOT NULL, price MONEY NOT NULL);
Желательно предусмотреть, чтобы типы у таблиц, которые мы планируем связать отношением наследования, совпадали. Что мы и сделали уже прямо в описании новой таблицы. Теперь создадим такое отношение в точности по руководству пользователя:
ALTER TABLE dvd INHERITS item;
Естественно, что для создания отношения наследования требуется выполнение некоторых общих условий для обоих таблиц, а именно:
NOT NULL
;CHECK
, отсутствующих в таблице-потомке.
Комментарии
Одно замечание про SERIAL
Необходимо отметить один из моментов, который возникает при использовании псевдотипа
SERIAL
.Рассмотрим две таблицы:
Визуально они вполне совпадают. Однако стоит помнить, что на самом деле это две разных таблицы, использующие разные генераторы последовательностей.
Теперь пусть таблица
test1
"удочерит" таблицуtest2
. Как мы уже рассматривали этот вопрос, при наследовании таблица-потомок будет использовать тот же счетчик, что и таблица-предок. Однако это, как оказывается, справедливо только для отношений наследования, организуемых при создании новых таблиц.В случае, который мы рассматриваем, такого не происходит - поле в таблице-потомке
test2
, хоть и одноименно и имеет один и тот же псевдотип, однако не будет наследоваться.