Скачиваний:
32
Добавлен:
01.04.2014
Размер:
418.3 Кб
Скачать

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 должны быть противоположными, по крайней мере, если это возможно.

Напомним читателю еще один важный принцип. Как было показано ранее в этой книге, реляционные операции всегда выполняются на множестве кортежей одновре­менно, а множество, состоящее из одного кортежа, является частным случаем. Более того, иногда необходимо выполнять многокортежные обновления (например, если операцию обновления нельзя реализовать с помощью серии однокортежных обнов­лений). В основном это утверждение истинно для базовых отношений и для пред­ставлений. Для простоты изложения большая часть правил обновления представле­ний будет сформирована в терминах однокортежных операций обновления, тем не менее, читатель не должен забывать тот факт, что использование однокортежных операций — это только дань простоте изложения и в некотором смысле даже искаже­ние истинного положения вещей.

Далее по очереди рассматриваются операции реляционной алгебры: объединение, пересечение, вычитание, а затем оставшиеся операции.

Соседние файлы в папке Дейтл Введ в БД