- •Часть 5
- •Глава 17 Представления
- •17.1. Введение
- •17.2. Для чего нужны представления
- •17.3. Определение данных
- •17.4. Манипуляции с данными: операции выборки
- •17.5. Манипуляции с данными: операции обновления
- •17.6. Обновление операций объединения, пересечения и вычитания
- •Объединение
- •Пересечение
- •17.7. Обновление представлений других видов
- •17.8. Снимки
- •17.9. Поддержка sql
- •17.10. Резюме
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.