4.1.3 Использование представлений для скрытия сложного синтаксисаЕще одно применение представлений — скрытие SQL-операторов со сложным синтаксисом. Это может делаться для того, чтобы избавить разработчиков от необходимости вводить сложный оператор всякий раз, когда им требуется определенное представление, или для того, чтобы разработчики, не знающие SQL, могли тем не менее воспользоваться преимуществами, которые предоставляют сложные SQL-операторы. Кроме того, как и в случае использования представлений для вычислений, это обеспечивает единообразие результатов. Два наиболее распространенных варианта использования представлений в данной ипостаси — это скрытие соединений и скрытие вложенных запросов. Предположим, что продавцам-консультантам галереи необходимо знать, какими художниками интересуется тот или иной клиент. Поскольку связь между сущностями CUSTOMER и ARTIST имеет вид N:M, она представлена в виде таблицы пересечения. Таким образом, чтобы отобразить сведения об интересах клиентов, необходимо выполнить два соединения: сначала соединить таблицы CUSTOMER и CUSTOMER_ARTIST_INT, а затем полученный результат соединить с таблицей ARTIST. Представление, содержащее эти два соединения, конструируется с помощью следующего SQL-оператора: CREATE VIEW CustomerInterests AS Этот оператор выполняет стандартное двойное соединение. Обратите внимание на использование псевдонимов для таблиц (С вместо 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 * Результат получился следующий:
Представления используются также для скрытия группировки и встроенных функций. Рассмотрим следующее определение представления: CREATE VIEW ArtistWorkNet AS Это представление соединяет таблицы TRANSACTION, WORK и ARTIST и создает вычисляемый столбец NetPrice. С этим представлением можно выполнять различные операции на языке SQL, как если бы NetPrice был обычным столбцом таблицы. Например, чтобы отобразить совокупную прибыль от продажи каждой картины, можно использовать следующий оператор: SELECT Name, Title, Copy, SUM(NetPrice) AS TotalNet Результаты выполнения этого запроса показаны ниже:
У представлений имеется еще три важных применения. Во-первых, они могут обеспечивать определенный уровень абстракции между приложением базы данных и реальными таблицами. Этот уровень абстракции может быть важен, когда источник данных может меняться. Чтобы понять, о чем идет речь, рассмотрим следующее определение представления: CREATE VIEW CustomerTablel AS В сущности, это представление присваивает таблице CUSTOMER псевдоним CustomerTablel. Представление CustomerTablel можно обрабатывать точно таким же образом, как и таблицу CUSTOMER. Если в коде приложения используется имя CustomerTablel, то источник данных, на котором основано это представление, может меняться, не вызывая необходимости переписывать приложение. Следовательно, в определенный момент в будущем, если источником данных о клиентах станет другая таблица, например, NEW_CUSTOMER, все, что потребуется сделать, — это переопределить представление CustomerTablel следующим образом: CREATE VIEW CustomerTablel AS Весь код приложения, в котором используется имя CustomerTablel, без проблем будет работать с новым источником данных. Из-за потенциальной необходимости в изменении источников данных некоторые организации никогда не предоставляют разработчикам доступ к реальным таблицам. Вместо этого используются представления, базирующиеся на данных из этих таблиц. Такая стратегия повышает гибкость для будущих проектов по разработке баз данных и упрощает их перепроектирование.
|