Читать в оригинале

<< ПредыдущаяОглавлениеСледующая >>


4.1.3 Использование представлений для скрытия сложного синтаксиса

Еще одно применение представлений — скрытие SQL-операторов со сложным синтаксисом. Это может делаться для того, чтобы избавить раз­работчиков от необходимости вводить сложный оператор всякий раз, ко­гда им требуется определенное представление, или для того, чтобы разра­ботчики, не знающие SQL, могли тем не менее воспользоваться преиму­ществами, которые предоставляют сложные SQL-операторы. Кроме того, как и в случае использования представлений для вычислений, это обеспе­чивает единообразие результатов.

Два наиболее распространенных варианта использования представле­ний в данной ипостаси — это скрытие соединений и скрытие вложенных запросов.

Предположим, что продавцам-консультантам галереи необходимо знать, какими художниками интересуется тот или иной клиент. Поскольку связь между сущностями CUSTOMER и ARTIST имеет вид N:M, она пред­ставлена в виде таблицы пересечения. Таким образом, чтобы отобразить сведения об интересах клиентов, необходимо выполнить два соединения: сначала соединить таблицы CUSTOMER и CUSTOMER_ARTIST_INT, а затем полученный результат соединить с таблицей ARTIST. Представле­ние, содержащее эти два соединения, конструируется с помощью следую­щего SQL-оператора:

CREATE VIEW CustomerInterests AS
SELECT С.Name AS Customer, A.Name AS Artist
FROM CUSTOMER С
JOIN CUSTOMER_ARTIST_INT C1
ON С.CustomerlD = C1.CustomerlD JOIN ARTIST A
ON C1.ArtistID = A.ArtistID;

Этот оператор выполняет стандартное двойное соединение. Обра­тите внимание на использование псевдонимов для таблиц (С вместо CUSTOMER, C1 вместо CUSTOMER_ARTIST_INT, А вместо ARTIST). Такие псевдонимы упрощают выражения ON. Например, проще на­писать С.CustomerlD = C1.CustomerlD, чем CUSTOMER.CustomerlD = CUSTOMER_ARTIST_INT.CustomerlD. Использовать псевдонимы не обязательно.

Также обратите внимание на переименование С.Name в Customer и A.Name в Artist. Такое переименование выполнять необходимо, в против­ном случае в пердставлении оказались бы два столбца с именем Name. СУБД не смогла бы различить эти два столбца и выдала бы ошибку при создании представления.

Следующий оператор запрашивает данные из представления Customer Interests и сортирует результаты по столбцу Customer:

SELECT *
FROM Customerlnterests
ORDER BY Customer;

Результат получился следующий:

Customer

Artist

Chris Wilkens

Frings

Chris Wilkens

Tobey

David Smith

Tobey

Donald G. Gray

Tobey

Fred Smathers

Tobey

Lynda Johnson

Tobey

Lynda Johnson

Moos

Lynda Johnson

Frings

Mary Beth Frederickson

Frings

Mary Beth Frederickson

Moos

Mary Beth Frederickson

Tobey

Selma Warning

Tobey

Selma Warning

Miro

Tiffany Twilight

Chagall

Tiffany Twilight

Frings

Tiffany Twilight

Tobey

Представления используются также для скрытия группировки и встро­енных функций. Рассмотрим следующее определение представления:

CREATE VIEW ArtistWorkNet AS
SELECT W.WorkID, Name, Title, Copy, AcquisitionPrice, SalesPrice, (SalesPrice - AcquisitionPrice) AS NetPrice
FROM TRANSACTION T JOIN WORK W
ON T.WorkID = W.WorkID
JOIN ARTIST A
ON W.ArtistID = A.ArtistID;

Это представление соединяет таблицы TRANSACTION, WORK и ARTIST и создает вычисляемый столбец NetPrice. С этим представлени­ем можно выполнять различные операции на языке SQL, как если бы NetPrice был обычным столбцом таблицы. Например, чтобы отобразить совокупную прибыль от продажи каждой картины, можно использовать следующий оператор:

SELECT Name, Title, Copy, SUM(NetPrice) AS TotalNet
FROM ArtistWorkNet
GROUP BY Name, Title, Copy;

Результаты выполнения этого запроса показаны ниже:

Name

Title

Copy

TotalNet

Chagall

Northwest by Night

37/50

24500

Tobey

Slow Embers

NC

7750

Tobey

Mystic Fabric

105/135

14750

Tobey

Mystic Fabric

99/135

27550

Miro

Mi Vida

7/10

34800

У представлений имеется еще три важных применения. Во-первых, они могут обеспечивать определенный уровень абстракции между приложени­ем базы данных и реальными таблицами. Этот уровень абстракции может быть важен, когда источник данных может меняться. Чтобы понять, о чем идет речь, рассмотрим следующее определение представления:

CREATE VIEW CustomerTablel AS
SELECT *
FROM CUSTOMER;

В сущности, это представление присваивает таблице CUSTOMER псев­доним CustomerTablel. Представление CustomerTablel можно обрабаты­вать точно таким же образом, как и таблицу CUSTOMER.

Если в коде приложения используется имя CustomerTablel, то источник данных, на котором основано это представление, может меняться, не вы­зывая необходимости переписывать приложение. Следовательно, в опре­деленный момент в будущем, если источником данных о клиентах ста­нет другая таблица, например, NEW_CUSTOMER, все, что потребуется сделать, — это переопределить представление CustomerTablel следующим образом:

CREATE VIEW CustomerTablel AS
SELECT *
FROM NEW_CUSTOMER;

Весь код приложения, в котором используется имя CustomerTablel, без проблем будет работать с новым источником данных.

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

 



<< ПредыдущаяОглавлениеСледующая >>