- •7.7.6. Определить общее количество поставщиков
- •7.7.7. Определить в поставках максимальное
- •7.7.8. Для каждой поставляемой детали указать номер и общий объем поставки в штуках
- •7.7.9. Указать номера всех типов деталей, поставляемых более чем одним поставщиком
- •7.7.10. Определить имена поставщиков детали с номером т2'
- •7.7.11. Определить имена поставщиков по крайней мере одной красной детали
- •7.7.12. Указать номера поставщиков, статус которых меньше текущего максимального статуса
- •7.7.13. Указать имена поставщиков детали с номером 'р2'
- •7.7.14. Выбрать имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.7.15. Определить имена поставщиков всех типов деталей
- •7.7.16. Определить номера деталей, которые либо весят более 16 фунтов, либо поставляются поставщиком с номером 's2', либо и то, и другое
- •7.8. Резюме
- •8.2. Ограничения типа
- •8.3. Ограничения атрибута
- •8.4. Ограничения переменной-отношения
- •8.5. Ограничения баз данных
- •8.6. "Золотое правило"
- •8.7. Ограничения состояния и ограничения перехода
- •8.8. Ключи
- •3. Пусть r1 и r2 — ссылающаяся и ссылочная переменные-отношения соответственно.
- •8.9. Средства языка sql
- •8.10. Резюме
- •9.1. Введение
- •9.2. Для чего нужны представления
- •9.3. Выборка данных из представлений
- •9.4. Обновление данных в представлениях
- •9.5. Моментальные снимки
- •9.6. Поддержка представлений в языке sql
- •9.7. Резюме
- •Часть III
- •10.1. Введение
- •10.2. Основные определения
- •10.3. Тривиальные и нетривиальные зависимости
- •10.4. Замыкание множества зависимостей
- •10.5. Замыкание множества атрибутов
- •10.6. Неприводимые множества зависимостей
- •10.7. Резюме
- •Глава 1 1
- •I Переменные-отношения в знф I
- •11.2. Декомпозиция без потерь
- •11.3. Первая, вторая и третья нормальные формы
- •11.4. Сохранение зависимостей
- •11.5. Нормальная форма Бойса-Кодда
- •11.6. Замечание по поводу атрибутов, содержащих в качестве значений отношения
- •11.7. Резюме
- •12.1. Введение
- •12.2. Многозначные зависимости и четвертая нормальная форма
- •12.3. Зависимости соединения и пятая нормальная форма
- •Соединение по комбинации атрибутов j#,s#
- •Исходное состояние spj
- •12.4. Общая схема процедуры нормализации
- •12.5. Денормализация
- •12.6. Ортогональное проектирование (небольшое отступление от темы)
- •12.7. Другие нормальные формы
- •12.8. Резюме
- •12.3. Brosda V., Vossen g. Update and Retrieval Through a Universal Schema Interface // acm tods. — December, 1988. — 13, № 4.
- •12.5. Date c.J. Will the Real Fourth Normal Form Please Stand Up? // c. J. Date and Hugh Darwen. Relational Database Writings 1989-1991.— Reading, Mass.: Addison-Wesley, 1992.
- •12.20.Kent w. The Universal Relation Revisited // acm tods. — December, 1983. — 8, № 4.
- •12.22.Maier d., Ullman j.D. Fragments of Relations // Proc. 1983 sigmod Intern. Conf. On Management of Data. — San Jose, Calif. — May, 1983.
- •12.24.Maier d., Ullman j.D. Maximal Objects and the Semantics of Universal Relation Databases // acm tods. — March, 1983. — 8, № 1.
- •Глава 13
- •13.1. Введение
- •13.2. Общий подход
- •Каждыи экземпляр сущности ности «Произведение"
- •13.3. Модель "сущность/связь"
- •13.5. Проектирование базы данных с помощью метода er-моделирования
- •13.6. Краткий анализ er-модели
- •13.7. Резюме
9.2. Для чего нужны представления
Поддержка представлений желательна по многим причинам. Укажем некоторые из них.
Обеспечивается автоматическая защита скрытых данных
Под "скрытыми данными" здесь подразумеваются данные базовых таблиц, которые не видны в определенном представлении (например, в случае представления GOOD SUPPLIER это имена поставщиков). Такие данные надежно защищены от нежелательного доступа через конкретное представление (по крайней мере, в отношении операции выборки). Таким образом, ограничив доступ пользователей к базе данных некоторым набором представлений, можно получить простой и эффективный механизм обеспечения безопасности. Мы еще возвратимся к вопросу использования представлений в целях безопасности в главе 16.
■ Пользователям предоставляются средства сокращенной записи или "макросы "
Рассмотрим запрос "Определить все города, в которых хранятся детали, поставляемые некоторым поставщиком из Лондона". Требуемый запрос можно легко сформулировать с помощью представления CITY_PAIR (пары городов), определенного в предыдущем разделе.
( CITY PAIR WHERE SCITY = 'London' ) { PCITY }
Сформулировать данный запрос, не пользуясь этим представлением, будет сложнее.
( ( { S RENAME CITY AS SCITY ) JOIN SP
JOIN ( P RENAME CITY AS PCITY ) )
WHERE SCITY = 'London' ) { PCITY }
Хотя пользователь может применить последнюю формулировку, обращаясь непосредственно к базовой переменной-отношению (конечно, только в том случае, когда установленные ограничения безопасности позволяют ему это сделать), первая формулировка запроса, безусловно, проще. (Первая формулировка запроса на самом деле является просто сокращением второй. Перед выполнением запроса системный механизм обработки представлений расширит первое выражение и получит запрос в виде второго выражения.)
Просматривается явная аналогия с макросами в языках программирования, В принципе, пользователь может непосредственно записывать расширенные выражения в собственный код, но намного удобнее (по известным причинам) не делать этого и использовать сокращенную запись макросов, возложив процедуру их расширения на макропроцессор языка программирования. Аналогичные замечания применимы и в отношении представлений. Таким образом, в СУБД представления играют роль, аналогичную роли макросов в системах программирования, а хорошо известные преимущества и выгоды от использования макросов имеют место (с соответствующими оговорками) и в случае представлений. В частности, следует отметить, что использование представлений, как и использование макросов не приводит на этапе выполнения к снижению производительности приложений — некоторые дополнительные затраты имеют место только на этапе раскрытия представлений (как и в случае макросов).
■ Представления позволяют разным пользователям различным образом видеть одни и те же данные в одно и то же время
Другими словами, представления позволяют различным пользователям сосредоточить свое внимание и, возможно, логически реструктуризировать только ту часть базы данных, которая их интересует, игнорируя все остальные сохраняемые данные. Это соображение особенно важно для интегрированных баз данных, с которыми одновременно и независимо друг от друга работает множество категорий пользователей, имеющих самые различные требования.
■ Представления способны обеспечивать логическую независимость данных
Это одна из важнейших потенциальных возможностей представлений, поэтому мы рассмотрим ее отдельно в следующем разделе.
Логическая независимость данных
Напомним, что логическая независимость данных может быть определена как иммунитет пользователей и пользовательских программ к изменениям в логической структуре базы данных (где под логической структурой подразумевается концептуальный или "общий логический" уровень; см. главу 2). Несомненно, что представления являются
именно тем средством, с помощью которого в реляционной системе может быть достигнута логическая независимость данных. Логическая независимость данных имеет два важных аспекта — рост и реструктуризация базы данных.
Замечание. Аспект роста здесь обсуждается только для полноты изложения. Он достаточно важен, но его связь с представлениями весьма относительна.
■ Рост базы данных
По мере роста базы данных, аккумулирующей новые виды информации, должно соответственно возрастать и количество определений. Возможны два типа роста.
а) Расширение существующей базовой переменной-отношения с целью включе- ния нового атрибута. Новый атрибут предназначен для вновь добавляемых дан- ных, относящихся к существующему типу объектов. В качестве примера приве- дем добавление атрибута DISCOUNT (скидка) в базовую переменную-отношение поставщиков.
б) Создание новой базовой переменной-отношения для добавления в базу данных информации об объектах нового типа. Примером может служить добавление в базу данных поставщиков и деталей сведений о проектах.
Ни один из указанных типов роста не должен оказывать какого-либо влияния на работу существующих пользователей или пользовательских программ, по крайней мере в принципе (однако см. упр. 7.7 в главе 7, в котором рассматривается одна из проблем, возникающих при использовании языка SQL).
■ Реструктуризация базы данных
Иногда возникает необходимость так реструктуризировать базу данных, чтобы ее общее информационное наполнение осталось тем же, а изменилось только логическое расположение данных. Другими словами, требуется перегруппировка атрибутов базовых переменных-отношений. Рассмотрим простой пример реструктуризации. Предположим, что по какой-то причине (в данном случае точная причина не имеет значения) необходимо заменить переменную-отношение S следующими двумя переменными-отношениями.
VAR SNC BASE RELATION { St St, SNAME SNAME, CITY CHAR } PRIMARY KEY { Si } ;
VAR ST BASE RELATION { St St, STATUS INTEGER } PRIMARY KEY { St } ;
Здесь существенно то, что прежняя переменная-отношение S является соединением двух новых переменных-отношений SNC и ST (а переменные-отношения SNC и ST являются проекциями старой переменной-отношения S). Следовательно, можно создать представление, которое будет предусматривать выполнение указанного соединения, и присвоить ему имя S.
VAR S VIEW
SNC JOIN ST ;
Любая прикладная программа или интерактивная операция, в которой использовалась прежняя переменная-отношение S, теперь будет ссылаться на представление S. Следовательно, если предположить, что система корректно поддержива
em операции манипулирования данными в представлениях, пользователи и пользовательские программы действительно окажутся логически независимыми от подобной реструктуризации базы данных1.
Следует отметить, что замена исходной переменной-отношения S, содержащей данные о поставщиках, двумя проекциями этой переменной-отношения, SNC и ST, в общем случае является вовсе нетривиальной задачей. В частности, следует учитывать, что некоторых дополнительных действий потребует переменная-отношение SP, содержащая сведения о поставках, поскольку в ней используется внешний ключ, ссылающийся на исходную переменную-отношение поставщиков S (см. упр. 9.13).
Но возвратимся к главной теме обсуждения. Из примера с переменными-отношениями SNC и ST, конечно, не следует, что логическая независимость данных может быть достигнута при любой возможной реструктуризации. Ключевой вопрос здесь состоит в том, возможно ли однозначное отображение между версией базы данных после реструктуризации и ее исходной версией (т.е. обратима ли выполненная реструктуризация базы данных). Другими словами, вопрос заключается в том, являются ли эти две версии базы данных информационно-эквивалентными. Если нет, то совершенно очевидно, что логическая независимость данных будет недостижима.
Два важных принципа
В результате проведенного выше обсуждения логической независимости данных возникает еще один вопрос. Фактически представления имеют два совершенно разных назначения.
Пользователь, который реально определяет некоторое представление V, безусловно, знаком с соответствующим выражением X, определяющим это представление. Он может использовать имя V везде, где применимо выражение X, причем, в сущности, как мы уже убедились, это просто сокращенная запись данного выражения.
Пользователь, которому просто известно, что представление V существует и его можно применять, чаще всего не знаком с выражением X, определяющим это представление. Для него представление V должно выглядеть и вести себя точно так, как базовая переменная-отношение.
'
Это в принципе! К сожалению, современные
продукты (и сам стандарт языка SQL)
в
целом некорректно
поддерживают
операции обработки данных представлений
и, следовательно, эти программные
продукты не обеспечивают в должной
мере логической независимости от
показанных в примере изменений.
Говоря конкретнее, большинство
программных продуктов (но не все) в
настоящее время корректно поддерживает
только операции выборки данных через
представления и,
насколько известно автору, ни один из
продуктов не поддерживает операций
обновления данных в представлениях
корректно на все 100%. Поэтому такие
продукты обеспечивают логическую
независимость от структуры базы данных
для операций выборки данных, но не для
операций обновления данных.
обсуждении вопросов "реструктуризации" в предыдущем разделе. Очевидно, что можно либо определить S как базовую переменную-отношение, a SNC и ST — как представления проекции этой базовой переменной-отношения, либо определить SNC и ST как базовые переменные-отношения, a S — как представление соединения этих двух базовых переменных-отношений2. Отсюда следует, что не должно быть никаких предпочтений и никаких ненужных различий между базовыми и производными переменными-отношениями. Мы называем это утверждение принципом взаимозаменяемости базовых и производных переменных-отношений. Заметим в частности, что из этого принципа следует, что должна существовать возможность обновления представлений. Иначе говоря, возможности обновления базы данных не должны зависеть от произвольного по существу решения, каким переменным-отношениям быть базовыми, а каким — производными. Обсуждение этого вопроса будет продолжено в разделе 9.4.
Условимся пока называть множество всех базовых переменных-отношений "реальной" базой данных. Но типичный пользователь взаимодействует (в общем случае) не с реальной базой данных самой по себе, а с тем, что можно назвать "представительной" базой данных, состоящей (опять-таки, в общем случае) из некоторой смеси базовых переменных-отношений и представлений. Теперь предположим, что ни одна из переменных-отношений в такой представительной базе данных не может быть производной от остальных (в противном случае такая переменная-отношение могла бы быть удалена без потери данных)3. Поэтому, с точки зрения пользователя, все эти переменные-отношения являются базовыми переменными-отношениями по определению, поскольку они, безусловно, не зависят одна от другой (т.е. все они автономны в соответствии с терминологией главы 3). То же самое относится и к самой базе данных, т.е. выбор, какая база данных является "реальной", может быть сделан произвольно, поскольку все возможные варианты информационно равносильны. Последний вывод мы будем называть принципом относительности базы данных.