ВВЕДЕНИЕ

 

Напомним из главы 1, что представление—это виртуальная таблица, т. е. таблица, которая сама по себе не существует, но для пользователя выглядит таким образом, как будто она существует. В противоположность этому базовая таблица — это реальная таблица в том смысле, что для каждой строки такой таблицы в действительности имеется некоторый хранимый двойник этой строки в физической памяти (см. главу 13). Представления не поддерживаются их собственными физически отдельными различимыми хранимыми данными. Вместо этого в каталоге (фактически в таблице каталога SYSVIEWS) хранится их определение в терминах других таблиц. Ниже приводится пример представления:

CREATE VIEW ХОРОШИЕ_ПОСТАВЩИКИ

AS SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ, ГОРОД

FROM S

WHERE СОСТОЯНИЕ > 15;

Когда исполняется это предложение CREATE VIEW(создать представление), подзапрос, следующий за AS, являющийся фактически определением данного представления, не исполняется. Вместо этого он просто сохраняется в каталоге. Но для пользователя дело обстоит теперь таким образом, как будто бы в базе данных в действительности существует таблица, называемая ХОРОШИЕ_ПОСТАВЩИКИ, строки и столбцы которой показаны в необведенной пунктиром части рис. 8.1. ХОРОШИЕ_ПОСТАВЩИКИ представляет собой фактически «окно» в реальную таблицу S. Более того, это окно является динамическим: изменения в S будут автоматически и немедленно видны через это окно при условии, конечно, что эти изменения относятся к необведенной пунктиром части таблицы S. Подобным же образом изменения, внесенные в ХОРОШИЕ_ПОСТАВЩИКИ, будут автоматически и немедленно осуществлены и в реальной таблице S (см. ниже раздел 8.4).

Далее, в зависимости от искушенности пользователя и, возможно, также от рассматриваемого приложения, пользователь может или не может реализовать ХОРОШИЕ_ПОСТАВЩИКИ действительно как представление. Некоторые пользователи могут быть осведомлены об этом факте, а также о том, что имеется лежащая в основе этого представления реальная таблица S; другие могут искренне полагать, что ХОРОШИЕ_ПОСТАВЩИКИ — это сама «реальная» таблица. В любом случае нет никакой разницы Смысл заключается в том, что пользователь может производить операции над представлением ХОРОШИЕ_ПОСТАВЩИКИ точно так же, как если бы это была реальная таблица, за некоторыми исключениями, которые будут обсуждаться позже. Ниже приведен пример операции выборки данных (предложение SELECT) применительно к представлению ХОРОШИЕ_ПОСТАВЩИКИ:

SELECT *

FROM ХОРОШИЕ_ПОСТАВЩИКИ

WHERE ГОРОД Ø= 'Лондон';

 

 

ХОРОШИЕ_ ПОСТАВЩИКИ НОМЕР_ ПОСТАВЩИКА ФАМИЛИЯ СОСТОЯНИЕ ГОРОД
  S1 Смит Лондон
  S2 Джонс Париж
  S3 Влеик Париж
  S4 Кларк Лондон
  S5 Адамс Атенс

 

Рис. 8.1.ХОРОШИЕ_ПОСТАВЩИКИ как представление базовой таблицы S (необведенная пунктиром часть)

Нетрудно видеть, что это предложение безусловно выглядит точно так же, как обычное SELECT, оперирующее обычной базовой таблицей. Система, а фактически генератор планов прикладных задач, выполняет такую операцию, преобразуя ее в эквивалентную операцию над лежащей в основе базовой таблицей (или множеством таблиц, см. раздел 8.2). Такая эквивалентная операция для приведенного примера:

SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ, ГОРОД

FROM S

WHERE ГОРОД = 'Лондон'

AND СОСТОЯНИЕ> 15;

Это новое предложение может быть теперь скомпилировано, т. е. связано, и обычным образом исполнено. Преобразование, о котором говорилось выше, фактически делается путем слияния изданного пользователем предложения SELECT с предложением SELECT, которое было сохранено в каталоге при определении данного представления. Из каталога система знает, что FROM ХОРОШИЕ_ПОСТАВЩИКИ в действительности означает FROM S. Она знает также, что любая выборка из ХОРОШИЕ_ПОСТАВЩИКИ должна быть далее уточнена условием WHERE СОСТОЯНИЕ>15. Наконец, она знает также, что «SELECT *» для ХОРОШИЕ_ПОСТАВЩИКИ в действительности означает SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ, ГОРОД (из таблицы S). Следовательно, система способна транслировать первоначальное предложение SELECT, относящееся к виртуальной таблице ХОРОШИЕ_ПОСТАВЩИКИ, в эквивалентное предложение SELECT, оперирующее с реальной таблицей S,— эквивалентное в том смысле, что результат исполнения этого SELECT для реальной таблицы S такой же, как если бы в действительности имелась базовая таблица, называемая ХОРОШИЕ_ПОСТАВЩИКИ, и первоначальное предложение SELECT выполнялось бы по отношению к ней.

Подобным же образом интерпретируются операции обновления. Например, операция

UPDATE ХОРОШИЕ_ПОСТАВЩИКИ

SET СОСТОЯНИЕ = СОСТОЯНИЕ +10

WHERE ГОРОД ='Париж';

будет преобразована генератором планов прикладных задач в следующую:

UPDATE S

SET СОСТОЯНИЕ = СОСТОЯНИЕ +10

WHERE ГОРОД = 'Париж'

AND СОСТОЯНИЕ > 15;

Аналогично интерпретируются операции INSERT и DELETE.