- •Часть 5
- •Глава 17 Представления
- •17.1. Введение
- •17.2. Для чего нужны представления
- •17.3. Определение данных
- •17.4. Манипуляции с данными: операции выборки
- •17.5. Манипуляции с данными: операции обновления
- •17.6. Обновление операций объединения, пересечения и вычитания
- •Объединение
- •Пересечение
- •17.7. Обновление представлений других видов
- •17.8. Снимки
- •17.9. Поддержка sql
- •17.10. Резюме
17.4. Манипуляции с данными: операции выборки
В предыдущих разделах кратко описано преобразование операций выборки на представлении в эквивалентные операции на базовом отношении (отношениях). В данном разделе приводится формальное описание этого преобразования.
Прежде всего следует заметить, что данное реляционное выражение можно преобразовать в функцию на множестве отношений. Другими словами, в качестве аргументов эта функция будет получать различные отношения, а результатом ее вычисления будет другое отношение. Пусть D — это база данных (которую для текущих задач будем представлять как множество отношений), а V— это представление, определенное на множестве D, т.е. представление, определение которого является функцией Х на множестве D:
V = Х ( D ).
Пусть R — операция выборки на представлении V. Тогда R является функцией на множестве отношений:
R{V)=R(X(D)).
Таким образом, результат операции выборки по определению совпадает с результатом вычисления функции Х на множестве D (материализации представления V) и последующего выполнения операции R на материализованном отношении. Однако на практике эффективнее использовать описанную выше процедуру подстановки, которая эквивалентна формированию функции С, являющейся композицией R(X) двух функций Х и R (именно в этом порядке), и вычислению значения функции С непосредственно на D.
Теперь изложенное в предыдущих разделах должно значительно проясниться для читателя. Тем не менее, этот материал помещен именно здесь, и вот почему
• Во-первых, это создает базу для аналогичного обсуждения операций обновления в следующем разделе.
• Во-вторых, подробное рассмотрение операций выборки показало, что материализация — хотя и более разумный, но, похоже, неэффективный способ реализации представлений.
• В-третьих, хотя в принципе процедура подстановки определений представления вполне понятна и отлично работает в ста процентах случаев, весьма огорчает тот факт, что в некоторых программных продуктах для работы с SQL этот процесс не реализован; в этих приложениях выборки данных на представлениях могут неожиданно завершиться неудачей. Процедура подстановки не реализована в версиях стандарта SQL, выпущенных до 1992 года. Причиной, по которой в приложениях и стандартах SQL не работают операции выборки на представлениях, является неполная поддержка свойства реляционной замкнутости.
17.5. Манипуляции с данными: операции обновления
Проблема обновления данных в представлениях может быть коротко сформулирована в следующем виде. Рассмотрим конкретную операцию обновления на конкретном представлении. Какие обновления нужно внести в исходные отношения базы данных, чтобы в результате получить требуемое обновление данных в представлении? Формальное описание проблемы выглядит так. Пусть D— это база данных, а V— представление, определенное на D, т.е. представление, определение которого является функцией X на множестве D (как уже было описано выше):
V = Х ( D ).
Теперь пусть U— это операция обновления на представлении V. Так как U является функцией на множестве отношений, то ее результат можно представить в виде
U(V)=U(X(D)).
Тогда проблема операций обновления на представлениях сводится к поиску такой операции обновления U', для которой истинно выражение
U(X(D))=X(U'(D)).
Необходимость в такой операции обновления возникает из-за того, что "реально существует" только множество D (представления виртуальны) и выполнять операции обновления непосредственно на представлениях нельзя.
Замечание. Для полноты изложения заметим, что операция U' может не являться функцией на множестве отношений, результатом этой функции может быть множество разных отношений (если рассматривать операции обновления представлений, которые соединяют несколько отношений с помощью операции join и в которых необходимо обновлять все отношения).
Прежде чем продолжить изложение, хотелось, бы подчеркнуть, что на протяжении последних нескольких лет проблема обновления представлений была предметом важных исследований, в результате которых разработано множество различных подходов к решению этой проблемы, в частности предложения Кодда (Codd) для системы RM/V2 [4.4] (см. также [17.3, 17.7-17.9, 17.11, 17.13]). В этой главе изложен относительно новый подход [17.5, 17.6], менее специальный по сравнению с некоторыми предыдущими подходами и обладающий достоинством обратной совместимости с лучшими возможностями более ранних подходов. Кроме того, данный подход позволяет гораздо большее число представлений трактовать как обновляемые.
Некоторые важные принципы
Существует несколько важных принципов, которые должны соблюдаться любым механизмом обновления представлений. Первостепенным является следующий принцип:
Данный кортеж может появиться в данном отношении, только если этот кортеж удовлетворяет предикату данного отношения. Это утверждение истинно как для представления, так и для базового отношения.
(Этот принцип является простым изложением описанного в главе 4 факта, который гласит, что предикат данного отношения является критерием применимости операций обновления к этому отношению.)
Следует заметить, что в этой главе рассматриваются некоторые детали вопроса о том, что служит предикатом произвольного порожденного отношения.
Перечислим другие важные принципы обновления представлений.
1. Обновляемость или отсутствие обновляемое™ представления — понятие семантическое, а не синтаксическое. Другими словами, это понятие не зависит от выбранной формы записи определения представления. Например, два приведенных ниже представления семантически идентичны:
CREATE VIEW V AS
S WHERE STATUS > 25 OR CITY = 'Paris' ;
CREATE VIEW V AS
( S WHERE STATUS > 25 ) UNION ( S WHERE CITY = 'Paris' ) ;
Ясно, что оба представления должны быть обновляемыми. (В отличие от теоретического изложения, стандарт SQL и большинство современных SQL-приложений обеспечивают обновляемость только для первого представления. В контексте стандарта SQL и современных SQL-приложений второе представление не является обновляемым, что описывается ниже в этой главе.)
2. Из предыдущего пункта следует, что правила обновляемости должны корректно работать на представлениях особого вида — отношениях базы данных. Это утверждение должно быть истинным, так как любое отношение B базы данных можно рассматривать как представление, определенное как В union В, В intersect В, В where true, В minus С (если С— это отличное от B отношение, которое не имеет общих кортежей с отношением B) или любое другое выражение, результат которого в точности совпадает с отношением B. Таким образом, правила обновления, например объединенных представлений, используемые на представлении V= В union В, должны давать результат, аналогичный полученному после применения этих правил непосредственно на отношении B.
3. Применяемые правила должны сохранять симметричность. Например, правило delete для пересечения V = A intersect B не должно удалять кортежи произвольно из отношений A или B, так как удаление кортежа хотя бы из одного отношения удалит этот кортеж из представления. Вместо этого кортежи должны удаляться из обоих отношений A и B. (Другими словами, не должно существовать неоднозначности. Всегда должен быть единственный способ реализации данного обновления, который должен работать во всех случаях.)
4. Правила должны учитывать любые действия-триггеры, такие как каскадное удаление.
Замечание. По многим известным причинам здесь отдается предпочтение объявлению указанных триггеров, а не включению специального кода в правила. Тем не менее, правила прямого обновления представлений не выдвигают таких требований.
5. Для упрощения выкладок желательно представлять инструкцию update как последовательность конструкции удаления и вставки кортежа (delete-insert), именно так эта инструкция и будет представлена. Это сокращение вполне приемлемо, поэтому нужно понимать следующее.
• "В середине" процесса данного обновления не выполняется проверка предикатов отношений. Таким образом, расширенная запись инструкции
UPDATE выглядит как DELETE-INSERT-проверка, а не как DELETE-проверка-INSERT-проверка. Причиной служит тот факт, что инструкция delete временно нарушает истинность предиката отношения, в то время как инструкция update не нарушает. Например, предположим, что отношение R содержит 10 кортежей, и рассмотрим эффект операции "ОБНОВИТЬ кортеж t" на отношении R, если из предиката отношения R следует, что это отношение должно содержать не меньше 10 кортежей.
• Триггеры никогда не запускаются "в середине" любой операции обновления. (Фактически триггеры запускаются по окончании операции, но перед проверкой предиката отношения.)
• Сокращения требуют некоторых "незначительных усовершенствований" для представлений типа проекции.
Как отмечалось выше, трактовка инструкции update как комбинации delete-insert означает, что эту инструкцию можно рассматривать как операцию над целым кортежем, а не как замену отдельных значений атрибутов в составе кортежа.
6. Все операции обновления на представлениях реализуются на однотипных операциях обновления исходных отношений. Таким образом, операции вставки (insert) и удаления (delete) на представлениях реализуются соответственно с помощью операций вставки и удаления на исходных отношениях (учитывая предыдущий пункт, можно не рассматривать операцию update). С другой стороны, предположим, что существует некоторый тип представлений (пусть это представления, полученные с помощью операции объединения (union)), для которых операции insert преобразуются в операции delete на исходных отношениях. Тогда в некоторых случаях операции insert на исходных отношениях тоже иногда можно преобразовать в операции delete! Это следует из утверждения (см. пункт 2), что любое базовое отношение B можно представить в виде объединяющего представления V=B union B. Аналогичное утверждение применимо и для представлений остальных типов (выборка, проекция, пересечение и т.д.). Однако утверждение, что на базовых отношениях операции вставки данных могут являться операциями удаления, — очевидный абсурд. Таким образом, истинным является утверждение, что операции insert и delete на представлениях преобразуются в соответствующие операции insert и delete на базовых отношениях.
7. В основном применение правил на выбранном представлении V указывает операции, предназначенные для выполнения на отношениях, на которых определено представление V. Эти правила должны работать даже тогда, когда отношения, на которых определено представление, в свою очередь, являются порожденными. Другим словами, правила должны обладать свойством рекурсивного применения. Конечно, если попытка обновить выбранное представление приводит к попытке обновления исходного отношения, которое не является обновляемым, то исходная операция обновления завершится неудачей.
8. Правила не должны "предполагать", что база данных хорошо спроектирована (т.е. полностью нормализована). Тем не менее, правила могут привести к несколько неожиданным результатам, если база данных спроектирована неудачно. Это лишний раз свидетельствует в пользу поддержки хорошей структуры базы данных. Ниже будет приведен пример с несколько неожиданными результатами.
9. Если представление обновляемо, то не должно существовать никаких причин, запрещающих операции обновления определенного типа (например, нельзя разрешать операции delete и запрещать операции insert).
10. Операции insert и delete должны быть противоположными, по крайней мере, если это возможно.
Напомним читателю еще один важный принцип. Как было показано ранее в этой книге, реляционные операции всегда выполняются на множестве кортежей одновременно, а множество, состоящее из одного кортежа, является частным случаем. Более того, иногда необходимо выполнять многокортежные обновления (например, если операцию обновления нельзя реализовать с помощью серии однокортежных обновлений). В основном это утверждение истинно для базовых отношений и для представлений. Для простоты изложения большая часть правил обновления представлений будет сформирована в терминах однокортежных операций обновления, тем не менее, читатель не должен забывать тот факт, что использование однокортежных операций — это только дань простоте изложения и в некотором смысле даже искажение истинного положения вещей.
Далее по очереди рассматриваются операции реляционной алгебры: объединение, пересечение, вычитание, а затем оставшиеся операции.