Частенько возникает такой вопрос, что у нас уже есть некоторая БД и нам необходимо внести в неё какие-то дополнительные зависимости, чтоб её структурировать. Обычно при этом обнаруживается масса "приятных" вещей вроде несовпадения типов и тому подобного. Однако от этого никуда не деться - большинство дополнительных требований к БД возникает уже в процессе её использования, поэтому частенько приходится резать по-живому...
Не обойтись без этого и при создании иерархии таблиц с помощью наследования.
Вроде все 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, хоть и одноименно и имеет один и тот же псевдотип, однако не будет наследоваться.