Создание иерархии в уже имеющейся базе

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

CREATE TABLE test1 (
	 id SERIAL);
CREATE TABLE test2 (
	id SERIAL);
ALTER TABLE test2
	INHERIT test1;

Визуально они вполне совпадают. Однако стоит помнить, что на самом деле это две разных таблицы, использующие разные генераторы последовательностей.
Теперь пусть таблица test1 "удочерит" таблицу test2. Как мы уже рассматривали этот вопрос, при наследовании таблица-потомок будет использовать тот же счетчик, что и таблица-предок. Однако это, как оказывается, справедливо только для отношений наследования, организуемых при создании новых таблиц.
В случае, который мы рассматриваем, такого не происходит - поле в таблице-потомке test2, хоть и одноименно и имеет один и тот же псевдотип, однако не будет наследоваться.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

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