- •Часть 5
- •Глава 17 Представления
- •17.1. Введение
- •17.2. Для чего нужны представления
- •17.3. Определение данных
- •17.4. Манипуляции с данными: операции выборки
- •17.5. Манипуляции с данными: операции обновления
- •17.6. Обновление операций объединения, пересечения и вычитания
- •Объединение
- •Пересечение
- •17.7. Обновление представлений других видов
- •17.8. Снимки
- •17.9. Поддержка sql
- •17.10. Резюме
Часть 5
Глава 17 Представления
17.1. Введение
Как отмечалось в главе 3, представление, по сути, является именованным выражением реляционной алгебры или реляционного исчисления. Ниже показан простой пример создания представления (view) на основе алгебры:
CREATE VIEW GOOD_SUPPLIERS AS
( S WHERE STATUS > 15 ) [ S#, STATUS, CITY ] ;
Когда данное выражение выполняется, то часть, следующая за инструкцией as и являющаяся собственно определением представления, на самом деле не выполняется, а "запоминается" системой посредством записи этого выражения в каталоге базы данных под именем GOOD_SUPPLIERS. Тем не менее, пользователю представляется, будто в базе данных существует реальное отношение GOOD_SUPPLIERS со своими кортежами и атрибутами, показанными в незатененной части таблицы на рис. 17.1. Другими словами, имя GOOD_SUPPLIERS ссылается на виртуальное отношение, т.е. на отношение, которое является результатом вычисления выражения, определяющего представление.
GOOD_SUPPLIERS
-
S#
SNAME
STATUS
CITY
S1
S2
S3
S4
S5
Smith
Jones
Blake
Clark
Adams
20
10
30
20
30
London
Paris
Paris
London
Athens
Рис. 17.1. GOOD_SUPPLIERS как представление исходного отношения S. В представление не входят данные, приведенные курсивом.
В главе 3 также было показано, что представление в некотором смысле может служить окном для просмотра данных. Любые изменения, вносимые в исходные данные, будут автоматически и мгновенно отображаться в представлении (в этом окне), и наоборот, все изменения, вносимые в данные представления, будут автоматически вноситься в исходные данные и соответственно отображаться в представлении. В приведенных выкладках предполагается, что изменения вносятся в области определения представления.
Теперь, в зависимости от опыта работы (и, возможно, от сложности используемого приложения), пользователь может не догадываться, что GOOD_SUPPLIERS — представление. Некоторые пользователи знают об этом, а также о том, что существует реальное отношение S; другие могут искренне верить, что GOOD_SUPPLIERS — настоящее отношение. Независимо от догадок пользователей, суть представления состоит в том, что с ним можно работать так, как будто оно является настоящим отношением. Приведем пример запроса к GOOD_SUPPLIERS:
Т1 := GOOD SUPPLIERS WHERE CITY <> 'London' ;
Ниже показан результат выполнения этого выражения.
T1
-
S#
STATUS
CITY
S3
S5
30
30
Paris
Athens
В основном этот запрос похож на обычный запрос к обычному "реальному" отношению; как отмечалось в главе 3, система обрабатывает запросы такого типа путем их преобразования в запросы к базовому отношению (или базовым отношениям). Такое преобразование можно осуществить, заменив (в определении запроса) все вхождения имени представления выражением, которое определяет представление. После преобразования будет получен следующий запрос:
Т1 :=( ( S WHERE STATUS > 15 ) [ S#, STATUS, CITY ] )
WHERE CITY <> 'London' ;
Данное выражение легко преобразовать в более простую форму:
Т1 := ( S WHERE STATUS > 15 AND CITY <> 'London' )
[ S#, STATUS, CITY ] ;
Результат вычисления последнего выражения совпадает с приведенным выше результатом запроса к представлению.
В данном случае необходимо заметить, что процесс подстановки (т.е. процесс замены имени представления на определяющую его строку) выполняется правильно вследствие реляционного свойства замкнутости, которое (кроме всего прочего) означает, что в любом месте выражения, где разрешено использовать имя отношения R, вместо него можно использовать выражение Х (здесь, естественно, предполагается, что вычисление выражения Х дает отношение, идентичное отношению R). Другими словами, представления работают точно, поскольку в реляционной алгебре множество отношений замкнуто. Это еще один пример, подтверждающий важность свойства замкнутости.
Операции обновления на представлениях трактуются аналогично. Например, операция
UPDATE GOOD_SUPPLIERS WHERE CITY = 'Paris'
STATUS := STATUS + 10 ;
будет преобразована в операцию
UPDATE S WHERE STATUS > 15 AND CITY=’Paris’
STATUS:= STATUS + 10 ;
Операции INSERT и DELETE обрабатываются аналогично.