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

17.6. Обновление операций объединения, пересечения и вычитания

В этом разделе делается предположение, что обновление выполняется на представле­ниях, определенных с помощью операций объединения (A union B), пересечения (A intersect B) или вычитания (A minus B), где A и B произвольные реляционные выражения (не обязательно базовые отношения). В данном случае A и B должны представлять совместимые по типу отношения (возможно, виртуальные). Предикаты отношений A и B будут обозначаться соответственно РА и РВ.

Замечание. Различные правила, которые описываются ниже, ссылаются на воз­можность возникновения побочных эффектов. Конечно, всем известно, что побоч­ные эффекты весьма нежелательны. Однако проблема состоит в том, что некоторых побочных эффектов нельзя избежать, если A и B являются пересекающимися под­множествами кортежей одного отношения; подобная ситуация часто встречается в представлениях, построенных с помощью операций объединения, пересечения или вычитания. Далее приводятся примеры таких представлений.

Объединение

Приведем правило вставки кортежа в представление вида A union B.

INSERT. Новый кортеж должен удовлетворять предикату РА или РВ либо обоим предикатам одновременно. Если новый кортеж удовлетворяет РА, то этот кортеж должен быть вставлен в A (заметьте, что операция вставки может иметь побочный эффект, в результате которого новый кортеж будет вставлен и в B). Если новый кор­теж удовлетворяет предикату РВ, то этот кортеж вставляется в B только при условии, что он еще не вставлен в B в результате побочного эффекта от вставки в A.

Замечание. Специфический способ выражения, использованный для записи пра­вила "вставить в A, а затем вставить в B”, должен восприниматься только как пе­дагогический прием. Не следует заблуждаться, что СУБД будет выполнять пока­занное правило в точности так, как оно изложено. На самом деле принцип сим­метрии предполагает намного больше, так как ни A, ни B не имеют преимуществ друг перед другом в процессе вставки кортежа. Аналогичные соображения приме­нимы для всех правил, рассматриваемых в этом разделе.

Пояснение. Новый кортеж должен удовлетворять предикату PA или PB, так как в противном случае данный кортеж не попадет в A union B, другими словами, не будет удовлетворять предикату объединения (PA) OR (РВ). (Кроме того, новый кортеж не должен уже присутствовать ни в A, ни в B, так как в противном случае будет выпол­няться попытка вставки кортежа, который уже существует.) Предположим, что пере­численные условия удовлетворены, тогда новый кортеж будет вставлен в A или B в зависимости от того, к какому виртуальному отношению этот кортеж принадлежит (возможно, к обоим).

Примеры. Пусть представление UV определено как

( S WHERE STATUS > 25 ) UNION ( S WHERE CITY = 'Paris' )

В таблице на рис. 17.2 приведены пробные данные рассматриваемого представле­ния с пробными значениями атрибутов.

UV

s#

SNAME

STATUS

CITY

S2

Jones

10

Paris

S3

Blake

30

Paris

S5

Adams

30

Athens

Рис. 17.2. Представление UV (пробные значения)

• Пусть (S6, Smith, 50, Rome) — кортеж, который нужно вставить в представление UV. Этот кортеж удовлетворяет предикату s where status > 25 (однако не удовлетворяет предикату s where city = 'Paris'). Следовательно, новый кортеж вставляется в от­ношение, удовлетворяющее предикату s where status > 25. Из правил вставки кор­тежей в выборку, которые достаточно просты (см. ниже), следует, что новый кортеж будет вставлен в базовое отношение, содержащее информацию о поставщиках.

• Теперь предположим, что в представление UV нужно вставить кортеж (S7, Jones, 50, Paris). Этот кортеж удовлетворяет обоим предикатам S WHERE STATUS > 25 И S WHERE CITY = 'Paris'. Логично предположить, что этот кортеж должен быть вставлен в оба виртуальных отношения. Тем не менее, следует заметить, что вставка кортежа в одно из виртуальных отношений имеет побочный эффект, вследствие которого кортеж вставляется и в другое виртуальное отноше­ние. Таким образом, не нужно явно вставлять кортеж в другое отношение.

Теперь рассмотрим два различных базовых отношения, SA и SB. Отношение SA содержит информацию о поставщиках, для которых атрибут status превышает 25. Отношение SB содержит информацию о поставщиках, расположенных в Париже (рис. 17.3). Предположим, что представление UV определено как объединение SA union SB, и вновь рассмотрим операцию вставки двух обсуждаемых выше корте­жей. Вставка кортежа (S6, Smith, 50, Rome) в представление UV приведет к вставке кортежа в базовое отношение SA, если предположить, что такая вставка необходима. В то же время вставка кортежа (S7, Jones, 50, Paris) в представление UV приведет к вставке кортежа в оба отношения, SA и SB. Полученный результат логически коррек­тен, хотя и не совсем интуитивно понятен (именно этот результат выше был назван "несколько неожиданным"). Подобные "неожиданности" возникают исключительно как следствие плохо спроектированной структуры базы данных. В частности, если плохо спроектирована структура базы данных, позволяющая достаточно похожим кортежам присутствовать в различных отношениях. Эта проблема (возможно, спор­ная) детально рассматривается в [17.12].

SA SB

s#

SNAME

STATUS

CITY

S#

SNAME

STATUS

CITY

S3

Blake

30

Paris

S2

Jones

10

Paris

S5

Adams

30

Athens

S3

Blake

30

Paris

Рис. 17.3. Базовые отношения SA и SB (пробные значения атрибутов)

Теперь сосредоточимся на правилах удаления кортежей из представлений типа

A UNION В.

DELETE. Если удаляемый кортеж принадлежит А, то он удаляется из А (заметьте, что это удаление может иметь побочный эффект, вследствие которого этот же кортеж будет удален и из В). Если после удаления кортежа из А этот кортеж при­сутствует в В, то он удаляется и из В.

Примеры для демонстрации этого правила предлагается создать пользователю в качестве упражнения. Следует заметить, что удаление кортежа из А или В может при­вести к каскадным операциям delete или к запуску других триггеров.

И, наконец, рассмотрим правила обновления.

• UPDATE. Обновляемый кортеж должен быть таким, чтобы его обновленная версия удовлетворяла предикату РА или РВ либо обоим предикатам. Если кортеж принад­лежит А, то его удаляют из А без запуска каких-либо триггеров, связанных с обыч­ной операцией удаления (каскадное удаление и т.п.). Кроме того, после удаления предыдущей версии кортежа не выполняется проверка предиката для А. Следует за­метить, что операция удаления (delete) может иметь побочный эффект, вследствие которого выбранный кортеж будет удален и из В. Если после удаления из А (и, воз­можно, побочного эффекта) кортеж все еще присутствует в В, то он удаляется из В (опять же без проверки предиката для В и без запуска каких-либо триггеров). После этого, если обновленная версия кортежа удовлетворяет предикату РА, кортеж встав­ляется в А (эта операция может иметь побочный эффект, вследствие которого новая версия кортежа может появиться и в В). И наконец, если обновленная версия корте­жа удовлетворяет предикату РВ, то кортеж вставляется в В только в том случае, если он не вставлен в В в результате побочного эффекта от вставки в А.

Приведенное правило обновления в основном состоит из правила удаления, за ко­торым следует правило вставки. Единственным исключением является отсутствие триггеров и проверок предикатов отношений после удаления старой версии кортежа (любые триггеры и проверки, связанные непосредственно с операцией обновления (update), выполняются после завершения всех операций удаления и вставки).

Рассмотрим одно важное следствие приведенной трактовки операции обновления (update), которое состоит в том, что после операции обновления представления кор­теж может мигрировать из одного отношения в другое. В базе данных, показанной на рис. 17.3, обновление в представлении UV кортежа (S5, Adams, 30, Athens) на кортеж (S5, Adams, 15, Paris) приведет к удалению кортежа из отношения SA и вставке этого кортежа в отношение SB.

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