Скачиваний:
102
Добавлен:
02.05.2014
Размер:
2.3 Mб
Скачать

9.4. Обновление данных в представлениях

Проблема обновления данных в представлениях может быть сформулирована сле­дующим образом. Пусть дана определенная операция обновления в заданном представ­лении. Какие обновления и в какие исходные базовые переменные-отношения нужно внести, чтобы реализовать исходное обновление представления? Формальное описание

проблемы выглядит так. Пусть D — это база данных, а V — представление, определенное на D (т.е. представление, определение которого является функцией X на множестве D). Тогда, как известно из раздела 9.3, получаем следующее.

V = X ( D )

Теперь пусть U — это операция обновления в представлении V. Так как U можно счи­тать операцией, результат выполнения которой состоит в изменении ее аргументов, пра­вомочно представить ее в следующем виде.

U ( V ) = 0 ( X ( D 5 )

Тогда проблема выполнения обновления в представлении сводится к поиску такой операции обновления W на множестве D, для которой истинно следующее выражение.

U ( X ( D ) ) = X ( U' ( D ) )

Операция подобного вида требуется по той причине, что реально существует только множество D (представления по определению виртуальны) и выполнять операции обнов­ления непосредственно в представлениях как таковых невозможно.

Прежде чем продолжить изложение, хотелось бы подчеркнуть, что на протяжении не­скольких последних лет проблема обновления представлений была предметом ряда важ­ных исследований, в результате проведения которых было разработано множество раз­личных подходов к решению этой проблемы (в том числе и автором этой книги). Под­робные сведения об этих исследованиях можно найти, например, в [9.7], [9,10]-[9.13], [9.15], [17.13] В частности, предложения Кодда (Codd) для системы RM/V2 описываются в [5.2]. В этой главе изложен относительно новый подход [9.9], менее произвольный по сравнению с существовавшими ранее подходами, но обладающий преимуществом со­вместимости с лучшими аспектами этих подходов. Кроме того, новый подход позволяет считать обновляемым гораздо более широкий класс представлений по сравнению с прежними подходами. При этом подходе фактически все представления считаются по­тенциально обновляемыми — за исключением лишь тех, которые нарушают установлен­ные ограничения целостности.

Еще раз о "золотом правиле"

Напомним золотое правило, определенное в предыдущей главе.

Любым операциям изменения запрещается когда-либо переводить переменную-отношение в состояние, которое противоречит ее собственному предикату.

При определении этого правила подчеркивалось, что оно применимо ко всем перемен­ным-отношениям, как к базовым, так и к производным. Иначе говоря, производные пере­менные-отношения также имеют предикаты, как и должно быть согласно принципу взаимо­заменяемости. Эти предикаты должны быть известны системе, что позволит ей правильно выполнять обновления представлений. Что же собой представляет предикат представле­ния? Очевидно, что, прежде всего, нам необходим набор правил вывода предиката, та­кой, что если известен предикат (предикаты) на входе (входах) любой реляционной опера­ции, то с его помощью можно определить предикат на выходе этой операции. Если такой набор правил будет получен, то мы сможем вывести предикат представления из предиката базовой переменной-отношения (или переменных-отношений), в терминах которой прямо или косвенно это представление было определено. (Безусловно, предикаты для всех базо­

вых переменных-отношений можно считать известными: они представляют собой логиче­ское произведение всех ограничений переменной-отношения, т.е. ограничений потенци­альных ключей, определенных для данной базовой переменной-отношения.)

На самом деле определить требуемый набор правил очень легко — они следуют не­посредственно из определений реляционных операторов. Например, если А и В— две произвольные переменные-отношения некоторого типа и их предикаты есть РА и РВ со­ответственно, а представление С определено как A INTERSECT В, то очевидно, что преди­кат PC этого представления будет определяться выражением (PA) AND (РВ). Другими словами, некоторый кортеж будет появляться в представлении С тогда и только тогда, когда при его подстановке оба предиката, РА и РВ, принимают значение истина. О дру­гих реляционных операторах речь пойдет ниже в этом же разделе.

Замечание. Таким образом, производные переменные-отношения автоматически "наследуют" определенные ограничения от тех переменных-отношений, на основе которых они определены. Однако вполне возможно, что некоторая производная переменная-отношение станет объектом определенных дополнительных ограничений, накладываемых помимо и поверх наследуемых ограничений. Поэтому для производных переменных-отношений желательно иметь возможность устанавливать требуемые ограничения явно (например, это может быть возможность определения для представления потенциального ключа). Язык Tutorial D действительно поддерживает такую возможность. Однако для простоты изложения в дальнейшем мы эту возможность чаще всего будем игнорировать.

Механизм обновления представления

Существует несколько важных принципов, которые должны соблюдаться любым сис­тематическим подходом к проблеме обновления представлений. {Золотое правило, без­условно, важнейшее из них, но не единственное.) Перечислим эти принципы.

1. Обновляемость представления— понятие семантическое, а не синтаксическое. Дру- гими словами, оно не зависит от выбранной формы записи определения представле- ния. Например, два приведенных ниже представления семантически идентичны.

VAR V VIEW

S WHERE STATUS > 25 OR CITY = 'Paris' ;

VAR V VIEW

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

Очевидно, что оба эти представления должны быть или обновляемыми, или не об­новляемыми (на самом деле они, безусловно, должны быть обновляемыми). Одна­ко этому утверждению противоречат и стандарт SQL, и большинство существую­щих на данный момент SQL-продуктов, которые совершенно безосновательно по­лагают, что первое из приведенных представлений обновляемо, а второе— нет (подробности приводятся в разделе 9.6).

2. Как следует из предыдущего рассуждения, механизм обновления должен корректно работать и в тех частных случаях, когда "представление" на самом деле является базовой переменной-отношением, поскольку любая базовая переменная-отношение В семантически неотличима от представления V, определенного как операция В UNION В или В INTERSECT В, или В WHERE true, или любое другое выражение, равносильное переменной-отношению В. Таким образом, правила обновления, ус-

тановленные, например, для представления, которое определено с помощью опера­ции объединения V = В UNION В, должны давать тот же результат, что и в случае, когда рассматриваемая операция обновления применяется непосредственно к базо­вой переменной-отношению В. Иначе говоря, хотя тема данного раздела и звучит как "обновление представлений", на самом деле в общем случае здесь рассматри­вается обновление переменных-отношений. Мы рассмотрим теорию обновления, применимую ко всем переменным-отношениям, а не только к представлениям,

  1. Применяемые правила должны сохранять симметричность во всех случаях, когда она применима. Например, правило удаления DELETE для представления, опреде­ленного как пересечение V = A INTERSECT В, не должно допускать произвольного удаления кортежа из переменной-отношения А или В даже тогда, когда такое одно­стороннее удаление кортежа наверняка вызовет удаление этого кортежа из рас­сматриваемого представления. В подобном случае кортеж должен удаляться из обеих переменных-отношений А и В. (Другими словами, не должно быть никакой неоднозначности. Всегда должен существовать единственный способ реализации данного обновления, который срабатывает во всех случаях. В частности, не должно быть никаких логических различий между представлениями, определенными как A INTERSECT В и В INTERSECT А.)

  2. В правилах обновления должны учитываться любые применимые триггерные про­цедуры, включая, в частности, определенные ссылочные действия, подобные "каскадному" удалению (устанавливаемому с помощью опции CASCADE).

  3. Для упрощения синтаксиса желательно рассматривать операцию UPDATE как со­кращенную запись последовательности операций удаления и вставки (DELETE-INSERT); именно так мы и будем ее рассматривать. Это сокращение вполне прием­лемо при соблюдении следующих условий.

  • Не осуществляется никаких проверок предикатов переменных-отношений в ходе выполнения любого требуемого обновления. Имеется в виду, что расширенная запись операции UPDATE выглядит как DELETE-INSERT-лроверка, а не как DELETE-яроверка-INSERT-npoBepKa. Суть заключается в том, что операция DELETE вре­менно нарушает истинность предиката переменной-отношения, в то время как полная операция UPDATE ее не нарушает. Например, предположим, что перемен­ная-отношение R содержит ровно 10 кортежей, и рассмотрим действие операции UPDATE ее некоторого кортежа t при условии, что предикат этой переменной-отношения R устанавливает, что в ней не может содержаться менее 10 кортежей.

  • Триггерные процедуры также никогда не должны вызываться в середине вы­полнения любой операции обновления. (Фактически триггерные процедуры обычно выполняются сразу же по окончании операции, но до проверки преди­ката отношения.)

  • Сокращенная запись требует некоторых незначительных уточнений для пред­ставлений, определяемых на основе операции проекции (подробности приводят­ся ниже в этом разделе).

6. Все обновления данных в представлениях должны быть реализованы как обновления того же типа в исходных переменных-отношениях. Иначе говоря, операции вставки (INSERT) отображаются в операции вставки, операции удаления (DELETE) отобража-

ются в операции удаления (как было сказано выше, операции обновления (UPDATE) можно игнорировать). Предположим противное, т.е. что существует некоторый тип представлений (скажем, представлений, определяемых на основе операции объедине­ния), для которых операции INSERT отображаются в операции DELETE в исходных пе­ременных-отношениях. Но тогда операции INSERT для базовых переменных-отношений также должны в каких-то случаях отображаться в операции DELETE! Этот вывод непосредственно следует из утверждения (как мы уже убедились в ходе рассу­ждений в п. 2), что любую базовую переменную-отношение В можно представить в виде семантически идентичного представления V = В UNION В. Аналогичное рассуж­дение можно применить и для представлений остальных типов (представлений на основе операций выборки, проекции, пересечения и т.д.). Однако утверждение, что в базовых переменных-отношениях операции вставки данных могут в действитель­ности представляться операциями удаления, — очевидный абсурд. Таким образом, утверждение, что операции INSERT и DELETE в представлениях отображаются в со­ответствующие операции INSERT и DELETE в базовых переменных-отношениях, яв­ляется истинным.

  1. В общем случае правила обновления при их применении к заданному представле­нию V определяют операции, которые должны быть применены к переменным-отношениям, на которых определено данное представление V. Эти правила должны правильно срабатывать даже в том случае, когда те переменные-отношения, на ос­нове которых определено данное представление, в свою очередь, также являются представлениями. Другим словами, правила должны допускать возможность рекур­сивного применения. Конечно, если попытка обновить исходную переменную-отношение по каким-то причинам завершится неудачно, то и исходная операция обновления не будет выполнена. Другими словами, обновления в представлениях выполняются по принципу "все или ничего", точно так, как и в случае базовых пе­ременных-отношений.

  2. Правила не должны основываться на предположении, что база данных хорошо спроектирована, т.е. полностью нормализована (подробности приводятся в гла­вах 11 и 12). Тем не менее выполнение установленных правил может привести к несколько неожиданным результатам, если база данных спроектирована неудачно. Это еще раз свидетельствует в пользу необходимости создания добротных проек­тов базы данных. В следующем разделе будет приведен подобный пример с не­сколько неожиданными результатами.

  3. Не должно существовать никаких веских причин, чтобы в любом заданном пред­ставлении одни операции обновления разрешались, а другие — нет (например, раз­решена операция DELETE, но запрещена операция INSERT).

10. Операции INSERT и DELETE должны быть, насколько это возможно, обратными по отношению одна к другой.

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

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

Далее мы по очереди рассмотрим отдельные операции реляционной алгебры (объединение, пересечение и вычитание), а затем — все остальные операции.

Замечание. В первых трех случаях, в частности, подразумевается, что речь идет о пред­ставлении, определяющее выражение которого имеет соответственно одну из следующих трех форм: A UNION В, A INTERSECT В и A MINUS В, где А и В, в свою очередь, являются не­которыми реляционными выражениями (т.е. необязательно представляют базовые пере­менные-отношения). Переменные-отношения А и В должны иметь один и тот же реляцион­ный тип. Соответствующие предикаты данных переменных-отношений — это РА и РВ.

Операция объединения

Приведем правило вставки для представления вида A UNION В.

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

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

В нескольких обсуждаемых ниже правилах и примерах отмечается возможность возникно­вения побочных эффектов. Конечно, всем известно, что побочные эффекты обычно нежела­тельны. Однако проблема заключается в том, что некоторых побочных эффектов нельзя избе­жать, если переменные-отношения А и В являются пересекающимися подмножествами корте­жей одной и той же базовой переменной-отношения. Подобная ситуация часто встречается в представлениях, определенных с помощью операций объединения, пересечения или вычитания. В этом конкретном случае упомянутые побочные эффекты как раз желательны, а не наоборот.

Пояснение.Новый кортеж должен удовлетворять по крайней мере одному из преди­катов РА или РВ, так как в противном случае данный кортеж не будет включен в объеди­нение A UNION В, поскольку он не будет удовлетворять предикату производной перемен­

ной-отношения для объединения A UNION В, а именно— (PA) OR (РВ). (Кроме того, мы предполагаем, хотя такое предположение и не строго обязательно, что новый кортеж не должен в данный момент присутствовать ни в переменной-отношении А, ни в перемен­ной-отношении В, так как в противном случае это означало бы попытку вставить уже существующий кортеж.) Если предположить, что перечисленные условия удовлетворя­ются, то новый кортеж будет вставлен в переменную-отношение А или переменную-отношение В в зависимости от того, к какой из них этот кортеж логически принадлежит (возможно, к обеим).

Примеры. Пусть представление UV определено следующим образом.

VAR UV VIEW

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

На рис. 9.2 приведены возможные значения в этом представлении для нашего приме­ра базы данных.

s#

SNAME

STATUS

CITY

S2

Jones

10

Paris

S3

Blake

30

Paris

S5

Adams

30

Athens

Рис. 9.2. Представление UV (пример значений)

  • Пусть кортеж, который необходимо вставить в представление UV, имеет вид ('S6', 'Smith', 50, 'Rome')5. Этот кортеж удовлетворяет предикату 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'. Логично пред­положить, что он будет вставлен в обе переменные-отношения, удовлетворяющие каждому из этих предикатов. Тем не менее следует заметить, что вставка кортежа в одну из переменных-отношений будет иметь побочный эффект, вследствие кото­рого кортеж окажется автоматически вставленным и в другую переменную-отношение. Таким образом, вторую операцию вставки явно выполнять не нужно.

5 Подобное упрощенное обозначение для кортежей переменной-отношения В используется в этом разделе из соображений наглядности

Рассмотрим две различные базовые переменные-отношения, SA и SB. Переменная-отношение SA содержит информацию о поставщиках, для которых значение атрибута STATUS превышает 25. а в переменной-отношении SB содержатся сведения о поставщиках из Парижа (рис. 9.3). Предположим, что представление UV определено как объединение

SA UNION SB, и вновь рассмотрим операцию вставки двух уже упомянутых выше корте­жей. Вставка кортежа ('S6', 'Smith', 50, 'Rome') в представление UV приведет к вставке кортежа в базовую переменную-отношение SA, что, по-видимому, и требуется. Однако вставка кортежа ('S7', 'Jones', 50, 'Paris') в представление UV приведет к вставке кортежа в обе переменные-отношения SA и SB! Полученный результат логически корректен, хотя интуитивно и не совсем понятен (именно этот результат в предыдущем подразделе был назван "несколько неожиданным"). В моем понимании подобные "неожиданности" могут иметь место исключительно как следствие плохо спроекти­рованной структуры базы данных. В частности, на наш взгляд, если проект базы данных позволяет одним и тем же кортежам появляться (т.е. удовлетворять их предикатам) в разных базовых переменных-отношениях, это, определенно, плохой проект. Такая пози­ция (возможно, спорная) детально рассматривается в разделе 12.6 главы 12.

SA

SB

S# |

SNAME

STATUS

CITY

S#

SNAME

STATUS

CITY

S3 S5

Blake Adams

30 30

Paris Athens

S2 S3

Jones Blake

10 30

Paris Paris

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

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

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

В качестве упражнения придумайте примеры, иллюстрирующие данное правило. Следует заметить, что удаление кортежа из переменной-отношения А или В может при­вести к "каскадному" удалению или к запуску триггерных процедур.

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

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

которого новая версия данного кортежа может появиться и в переменной-отношении В). И наконец, если обновленная версия кортежа удовлетворяет предика­ту РВ, то кортеж вставляется в переменную-отношение В, но только в том случае, ес­ли он не был вставлен в данную переменную-отношение в результате побочного эф­фекта от вставки обновленного кортежа в переменную-отношение А.

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

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

Операция пересечения

Приведем правила обновления представлений вида A INTERSECT В. Причем в данном случае ограничимся формулированием правил без каких-либо дополнительных поясне­ний (они аналогичны пояснениям для правил обновления объединений). Единственное, о чем следует сказать, —• это то, что для представлений вида A INTERSECT В предикат при­нимает вид (PA) AND (РВ). Примеры для приведенных ниже правил предлагаем читате­лю привести самостоятельно в качестве упражнения.

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

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

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

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

Операция вычитания

Ниже приведены правила обновления представлений вида A MINUS В (для представлений данного вида предикат переменной-отношения можно записать так: (PA) AND NOT (РВ)).

  • Правило INSERT. Новый кортеж должен удовлетворять предикату РА и не дол­жен удовлетворять предикату РВ. Новый кортеж вставляется в переменную-отношение А.

  • Правило DELETE. Удаляемый из представления кортеж удаляется и из перемен­ной-отношения А.

  • Правило UPDATE. Обновляемый кортеж должен быть таким, чтобы его обнов­ленная версия удовлетворяла предикату РА и не удовлетворяла предикату РВ. Кортеж удаляется из переменной-отношения А без выполнения триггерных про­цедур и проверки предиката. Затем обновленная версия кортежа вставляется в пе­ременную-отношение А.

Операция выборки

Допустим, что выражение определения представления V можно задать в следующем виде: A WHERE р. И пусть РА будет предикатом переменной-отношения А. Тогда предикат представления V примет следующий вид: (PA) AND (р). Например, предикат для опера­ции выборки S WHERE CITY = 'London' будет иметь вид (PS) AND (CITY = 'London'), где PS является предикатом переменной-отношения поставщиков. Приведем правила об­новления для представлений вида A WHERE р.

  • Операция INSERT. Новый кортеж должен удовлетворять предикату РА и усло­вию р. Новый кортеж вставляется в переменную-отношение А.

  • Операция DELETE. Удаляемый кортеж удаляется из переменной-отношения А.

  • Операция UPDATE. Обновляемый кортеж должен быть таким, чтобы его об­новленная версия удовлетворяла предикату РА и условию р. Кортеж удаляется из переменной-отношения А без запуска каких-либо триггерных процедур и проверки предиката. Затем в переменную-отношение А вставляется обновлен­ная версия кортежа.

Примеры. Пусть представление LS определено следующим образом. VAR LS

S WHERE CITY = 'London' ; На рис. 9.4 приведен пример значений для этого представления.

LS

S#

SNAME

STATUS

CITY

SI

Smith

20

London

S4

Clark

20

London

Рис 9.4. Представление LS (пример значений)

  • Попытка вставить в представление LS кортеж вида ('S6', 'Green', 20, ' London') будет завершена успешно. Новый кортеж будет вставлен в перемен­ную-отношение S и, следовательно, появится также в представлении LS.

  • Попытка вставить в представление LS кортеж вида ('SI', 'Green', 20, 'London') будет воспринята, как ошибка, поскольку этот кортеж не удовлетворяет предикату переменной-отношения S (и, следовательно, представления LS). Причи­на ошибки в том, что этот кортеж нарушает требование уникальности потенци­ального ключа {S#}.

  • Попытка вставить в представление LS кортеж вида ('S6', 'Green', 20, 'Athens') завершится неудачно, поскольку этот кортеж нарушает условие CITY = 'London'.

  • Попытка удалить из представления LS кортеж ('SI', 'Smith', 20, 'London') завершится успешно. Кортеж будет удален из переменной-отношения S и, следо­вательно, из представления LS.

  • Попытка обновить в представлении LS кортеж ('SI', 'Smith', 20, 'London') к виду ('S6', 'Green', 20, 'London') завершится успешно. Попытка обновить тот же кортеж ('SI', 'Smith', 20, 'London') к виду ('S2', 'Smith', 20, 'London') или к виду ('SI', 'Smith', 20, 'Athens') будет неудачной (в каж­дом конкретном случае объясните, почему).

Операция проекции

Этот раздел также начинается с рассмотрения соответствующего предиката. Пусть атрибуты переменной-отношения А (с предикатом РА) разделены на две несвя­занные группы, например X и Y . Полагая, что X и Y представляют собой составные атрибуты, рассмотрим проекцию А{Х) переменной-отношения А по атрибуту X. Пусть {Х:х} будет кортежем этой проекции. Тогда, очевидно, предикатом для этой проекции будет следующий предикат: "Существует такое значение у из домена зна­чений атрибута Y, что кортеж {Х:х, Y:y} удовлетворяет предикату РА". Например, рассмотрим проекцию переменной-отношения S по атрибутам St, SNAME и CITY. Для каждого кортежа (s, п, с), который входит в данную проекцию, существует значе­ние статуса t, такое, что кортеж (s, n, t, с) удовлетворяет предикату перемен­ной-отношения S.

Ниже приведены правила обновления проекции А{Х}.

■ Правило INSERT. Пусть (х) — кортеж, который нужно вставить, и пусть у — значение по умолчанию, выбираемое из области значений атрибута Y (будет ошибкой, если такого значения по умолчанию не существует, т.е. для атрибута Y

применяется правило "значения по умолчанию запрещены")6. Кортеж (х, у), кото­рый должен удовлетворять предикату РА, будет вставлен в переменную-отно­шение А.

Замечание. Так как для потенциальных ключей обычно (но не всегда) применяет­ся правило "значения по умолчанию запрещены" (глава 18), представление, которое содержит не все потенциальные ключи исходной переменной-отношения, обычно не допускает выполнения операций вставки.

■ Правило DELETE. Из переменной-отношения А будут удалены все кортежи, у которых значение атрибута X совпадает со значением кортежа, удаляемого из представления А{Х}.

Замечание. На практике желательно, чтобы множество атрибутов X включало хотя бы один потенциальный ключ, тогда удаляемому из проекции А{Х} кортежу будет соответствовать единственный кортеж а в переменной-отношении А. Тем не менее нет никаких логических причин превращать это пожелание в жесткое требование. Аналогичное замечание относится и к операции UPDATE (см. ниже).

■ Правило UPDATE. Пусть (х) — это кортеж, который необходимо обновить, а (х') — это обновленная версия кортежа (х). Пусть а — это кортеж переменной-отношения А, имеющий те же значения атрибутов х, что и кортеж X. И пусть значения атрибутов множества Y в кортеже а будут иметь значения у. Сначала из переменной-отношения А будут удалены все кортежи а, отвечающие указан­ным выше требованиям, причем без выполнения триггерных процедур и про­верки предиката отношения. После этого для каждого определенного выше зна­чения у в переменную-отношение А будет вставлен кортеж (х1, у), если он удов­летворяет предикату РА.

Замечание. В этом определении присутствуют те "незначительные уточнения" применительно к операции проекции, которые упоминались в принципе 5 обнов­ления в разделе "Механизм обновления представления". Обратите внимание, что на последнем этапе правила для операции UPDATE (этапе вставки) в каждом встав­ляемом кортеже восстанавливается предыдущее значение атрибутов Y вмеЬто обычной замены значениями, используемыми по умолчанию, как это имеет место при выполнении самостоятельных операций INSERT.

Примеры. Пусть представление SC определено с помощью следующего выражения. SC { S#, CITY }

6 Как следует из этого высказывания, здесь мы подразумеваем, что имеются какие-то сред­ства (как в языке SQL), позволяющие устанавливать значения по умолчанию для атрибутов ба­зовых переменных отношений. Соответствующий синтаксис языка Tutorial D может иметь вид нового предложения в определении базовой переменной отношения, например DEFAULT (<список определений значений по умолчанию> ), где каждый элемент списка в параметре <список опреде­лений значений по умолчанию> имеет вид <имя атрибутов <значение по умолчанию>. Например, в определении переменной-отношения поставщиков S может быть добавлено предложение DEFAULT (STATUS О, CITY ").

На рис. 9.5 показан пример содержимого этого представления.

sc

s#

CITY

SI

London

S2

Paris

S3

Paris

S4

London

S5

Athens

Рис. 9.5. Представление SC (значения для примера)

  • Попытка вставить в представление SC кортеж ('S6', 'Athens') будет успешной. В результате этой операции в переменную-отношение S будет вставлен кортеж ('S6', л, t, 'Athens'), где л и t являются значениями, которые используются по умолчанию для атрибутов SNAME и STATUS соответственно.

  • Попытка вставить в представление SC кортеж j'SI', 'Athens') приведет к ошиб­ке, так как этот кортеж не удовлетворяет предикату переменной-отношения S (а значит, и представления SC). В частности, вставка этого кортежа нарушает прави­ло уникальности потенциального ключа {Si}.

  • Попытка удалить из представления SC кортеж ('SI', 'London') будет успешной. Кортеж поставщика с номером ' S1' будет удален из переменной-отношения S.

  • Попытка обновить кортеж ('SI', 'London') представления SC к виду ('S1', 'Athens') будет успешной. Это повлечет замену в переменной-отношении S кор­тежа ('SP, 'Smith', 20, 'London') кортежем ('SI', 'Smith', 20, 'Athens'), но не кортежем ('SI', л, t, 'Athens'), где л и t— значения по умолчанию. Обязательно обратите на это внимание.

  • Попытка обновить в представлении SC тот же кортеж ('SI', 'London') к виду (' S2', 'London') приведет к ошибке (укажите конкретную причину).

Случай, когда проекция не включает потенциальных ключей исходной переменной-отношения (например, проекция переменной-отношения S по атрибутам STATUS и CITY), оставлен в качестве упражнения для читателей.

Операция расширения

Пусть представление V создано с помощью следующего определяющего выражения. EXTEND A ADD ехр AS X

(Как обычно, предикатом переменной-отношения А будет РА.) Тогда предикат РЕ представления V будет иметь такой вид.

РА ( a ) AND е.К = ехр ( a )

Здесь е — это кортеж представления V, а а — кортеж, который остается, когда добав­ленный с помощью операции расширения компонент X удаляется (т.е. проще говоря, а — это проекция кортежа е по всем атрибутам переменной-отношения А). На обычном языке это можно сформулировать следующим образом.

Каждый кортеж е в результирующем отношении операции расширения имеет сле­дующие свойства: 1) кортеж а, получаемый из кортежа е посредством операции проекции, исключающей компонент К, удовлетворяет предикату РА; 2) значение компонента Xравно результату вычисления выражения ехр для кортежа а.

Приведем правила обновления для представлений, определяемых с помощью опера­ции расширения.

  • Правило INSERT. Пусть е — это кортеж, который нужно вставить. Он должен удовлетворять предикату РЕ. В переменную-отношение А будет вставлен кортеж а, порожденный из кортежа е посредством операции проекции, исключающей компонент X.

  • Правило DELETE. Пусть е — это кортеж, который нужно удалить. Из перемен­ной-отношения А будет удален кортеж а, порожденный из кортежа е посредством операции проекции, исключающей компонент X.

  • Правило UPDATE. Пусть е — это кортеж, который нужно обновить, а е' — обнов­ленная версия кортежа е, причем кортеж е' должен удовлетворять предикату РЕ. Сначала из переменной-отношения А без выполнения триггерных процедур и про­верки предиката этой переменной-отношения будет удален кортеж а, который поро­жден из кортежа е посредством операции проекции, исключающей компонент X. За­тем в переменную-отношение А будет вставлен кортеж а', который порожден из кортежа е' посредством операции проекции, исключающей компонент X.

Примеры, Пусть представление VPX определено с помощью следующего выражения. EXTEND Р ADD ( WEIGHT * 454 ) AS GMWT

На рис. 9.6 приведен пример возможных значений этого представления.

VPX

Р#

PNAME

COLOR

WEIGHT

CITY

GMWT

Р1

Nut

Red

12.0

London

5448.0

Р2

Bolt

Green

17.0

Paris

7718.0

РЗ

Screw-

Blue

17.0

Rome

7718.0

Р4

Screw

Red

14.0

London

6356.0

Р5

Cam

Blue

12.0

Paris

5448.0

Р6

Cog

Red

19.0

London

8626.0

Рис. 9.6. Представление VPX (значения для примера)

  • Попытка вставить кортеж ('Р7', 'Cog',' 'Red', 12, 'Paris', 5448) будет за­вершена успешно и приведет к вставке кортежа ('Р7', 'Cog', 'Red', 12, 'Paris') в переменную-отношение Р.

  • Попытка вставить кортеж ('Р7', 'Сод', 'Red', 12, 'Paris', 5449) потерпит неудачу (почему?).

  • Попытка вставить кортеж ('PI', 'Cog', 'Red', 12, 'Paris', 5448) потерпит неудачу (почему?).

  • Попытка удалить кортеж с ключом 'Р1' будет успешной и приведет к удалению кортежа с ключом 'Р1' из переменной-отношения Р.

  • Попытка обновить кортеж с ключом'PI'к виду ('PI', 'Nut', 'Red', 10, 'Paris', 4540) будет успешной и приведет к замене кортежа ('PI', 'Nut', 'Red', 12, 'London') в переменной-отношении Р кортежем ('PI', 'Nut', 'Red', 10, 'Paris').

  • Закончится неудачей попытка обновить тот же кортеж посредством замены номера детали номером 'Р2' (без изменения остальных атрибутов) или по­пытка его приведения к виду, в котором значение атрибута GMWT не будет рав­но значению атрибута WEIGHT, умноженному на 454 (в каждом случае укажите причину неудачи).

Операция соединения

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

В общем случае назначение функции поддержки представлений всегда состояло в стремлении стереть, насколько это возможно, разницу между представлениями и базо­выми переменными-отношениями, что весьма похвально. Тем не менее

  • обычно предполагалось (неявно), что отдельный кортеж базовой переменной-отношения всегда можно обновить независимо от всех остальных кортежей этой базовой переменной-отношения;

  • в то же время очевидно (явно), что обновить отдельный кортеж представления не­зависимо от всех остальных кортежей этого представления возможно не всегда.

Например, в [11.2] Кодд показал, что из результата определенного соединения невоз­можно удалить хотя бы один кортеж, так как это приведет к получению отношения, ко­торое "вовсе не является соединением двух каких-либо отношений" (это, в свою очередь, означает, что результат, возможно, не будет удовлетворять предикату переменной-отношения представления). Исторически сложилось так, что подобные операции обнов­ления представлений полностью отбрасывались ввиду невозможности сделать эти опе­рации полностью идентичными обновлениям базовых переменных-отношений.

Наш подход значительно отличается от изложенного выше. Говоря конкретнее, мы признаем тот факт, что даже в базовых переменных-отношениях не всегда можно об­новить отдельный кортеж независимо от остальных кортежей. Поэтому мы принимаем как допустимые те операции обновления представлений, которые по сложившейся традиции не рассматривались, и даем интерпретацию этих операций в виде четкого и логически корректного способа обновления исходных переменных-отношений. Более того, мы принимаем эти операции с полным пониманием того факта, что обновление

исходных переменных-отношений может оказывать побочный эффект на представле­ния. Однако такие побочные эффекты неизбежны и необходимы, так как в против­ном случае возникает опасность, что представление перестанет удовлетворять своему предикату.

Закончив вступительную часть, давайте перейдем к собственно обсуждению про­блемы. Прежде всего определим необходимые термины. После этого приведем прави­ла обновления представлений на основе соединений. Затем рассмотрим применение этих правил для каждого из трех типов соединений ("один к одному", "один ко мно­гим", "многие ко многим").

Рассмотрим соединение J = A JOIN В. Здесь (как и в разделе 6.4 главы 6) перемен­ные-отношения А, В и J имеют заголовки (X, Y}, {Y, Z} и {X, Y-, Z} соответственно. Пусть РА и РВ — это предикаты переменных-отношений А и В. Тогда предикат PJ пред­ставления J будет иметь следующий вид.

РА ( a ) AND РВ ( b )

Здесь для каждого заданного кортежа j соединения а является "А-частью" кортежа j (т.е. а — это кортеж, порождаемый из кортежа j посредством операции проекции, исключающей компонент Z), a b является "В-частью" кортежа j (т.е. кортежем, поро­ждаемым из кортежа j посредством операции проекции, исключающей компонент X). Другими словами,

Каждый кортеж в соединении таков, что А-частъ удовлетворяет предикату . РД а В-часть удовлетворяет предикату РВ.

Например, предикат для соединения переменных-отношений S и SP по атрибуту Si можно сформулировать следующим образом.

Каждый кортеж (s, n, t, с, р, q) в соединении таков, что кортеж (s, n, t, с) удовлетворяет предикату переменной-отношения S, а кортеж (s, р, q) удовлетворяет предикату переменной-отношения SP.

Приведем правила обновления представлений вида J = A JOIN В.

Отметим, что операция INSERT может иметь побочный эффект, вследствие которого В-часть кортежа j будет вставлена в переменную-отношение В, как в случае с представлениями, ос­нованными на объединении, пересечении и вычитании (см. выше). Аналогичное замечание касается правил для представлений, основанных на операциях DELETE и UPDATE. Для краткости мы не будем вам докучать, детально рассматривая возможность побочных эффектов в каждом случае.


  • Правило INSERT. Новый кортеж j должен удовлетворять предикату PJ. Если А-часть кортежа j не входит в переменную-отношение А, то она вставляется в А7. Если В-часть не присутствует в переменной-отношении В, то она вставляется в В.

  • Правило DELETE. А-часть удаляемого кортежа удаляется из переменной-отношения А и В-часть удаляемого кортежа удаляется из переменной-отношения В.

  • Правило UPDATE. Обновляемый кортеж должен быть таким, чтобы его обнов­ленная версия удовлетворяла предикату PJ. А-часть этого кортежа удаляется из переменной-отношения А без выполнения каких-либо триггерных процедур и проверки предиката, а В-часть кортежа удаляется из переменной-отношения В, опять же, без выполнения каких-либо триггерных процедур и проверки предиката.

Если после этого А-часть обновленного кортежа все еще отсутствует в перемен­ной-отношении А, то А-часть вставляется в А. Если В-часть обновленного корте­жа отсутствует в переменной-отношении В, то она вставляется в В. Теперь проверим возможность применения сформулированных правил ко всем трем существующим типам соединений.

Соединения типа "один к одному"

Прежде всего отметим, что в данном случае термин "один к одному" можно заменить более точным термином "(нуль или один) к (нулю или одному)". Другими словами, име­ет место ограничение целостности, гарантирующее, что для каждого кортежа перемен­ной-отношения А будет существовать не более одного соответствующего кортежа пере­менной-отношения В и наоборот. А это означает, что множество атрибутов Y, по которо­му выполняется соединение, должно быть суперключом для обеих переменных-отношений А и В (см. раздел 8.8 в главе 8, если необходимо освежить в памяти что-либо, касающееся суперключей).

Примеры

  • В качестве первого примера читателю предлагается рассмотреть эффект примене­ния приведенных выше правил к соединению переменной-отношения поставщи­ков S с самой собой по атрибуту номера поставщика St (только).

  • Во втором примере предположим, что в базе данных поставщиков и деталей со­держится еще одна переменная-отношение SR с атрибутами SI и REST, где атрибут St идентифицирует поставщика, а атрибут REST содержит данные о его любимом ресторане. Предположим, что в переменной-отношении SR представлены не все поставщики, сведения о которых имеются в переменной-отношении S. Читателю предлагается рассмотреть результат применения правила обновления к представ­лению, определенному как соединение вида S JOIN SR (по атрибуту St). Что из­менится, если поставщик будет представлен в переменной-отношении SR, но не будет представлен в переменной-отношении S?

Соединения типа "один ко многим"

Здесь термин "один ко многим" можно заменить более точным термином "(нуль или один) к (нулю или многим)". Другими словами, имеет место ограничение целост­ности, гарантирующее, что для каждого кортежа из переменной-отношения В сущест­вует не более одного соответствующего кортежа в переменной-отношении А. Обычно это означает, что множество атрибутов Y, по которому выполняется операция соеди­нения, должно содержать подмножество (скажем, К), такое, что К является потенци­альным ключом для переменной-отношения А и соответствующим внешним ключом для переменной-отношения В.

Замечание Если сформулированные выше требования выполняются, то выражение "нуль или один" можно заменить выражением "точно один".

Примеры. Пусть представление SSP определено следующим выражением.

S JOIN SP

(Безусловно, это соединение типа "внешний ключ к соответствующему потенциаль­ному ключу".) Пример содержимого этого представления показан на рис. 9.7.

s#

SNAME

STATUS

CITY

P#

QTY

SI

Smith

20

London

PI

300

SI

Smith

20

London

P2

200

SI

Smith

20

London

P3

400

SI

Smith

20

London

P4

200

SI

Smith

20

London

P5

100

SI

Smith

20

London

P6

100

S2

Jones

10

Paris

PI

300

S2

Jones

10

Paris

P2

400

S3

Blake

30

Paris

P2

200

S4

Clark

20

London

P2

200

S4

Clark

20

London

P4

300

S4

Clark

20

London

P5

400

Рис. 9.7. Представление SSP (значения для примера)

  • Попытка вставить в представление SSP кортеж {'S4', 'Clark', 20, 'London', ' Рб', 100) будет завершена успешно и приведет к вставке кортежа (' S4', ' Рб', 100) в переменную-отношение SP (в результате чего новый кортеж появится и в представлении).

  • Попытка вставить в представление SSP кортеж ('S5', 'Adams', 30, 'Athens', ' Рб', 100) будет завершена успешно и приведет к вставке кортежа (' S5', ' Рб', 100) в переменную-отношение SP (следовательно, новый кортеж добавится и к представлению).

  • Попытка вставить в представление SSP кортеж ('S6', 'Green', 20, 'London', 'Рб', 100) будет завершена успешно и приведет к вставке кортежа ('S6', 'Green', 20, 'London') в переменную-отношение S и к вставке кортежа ('S6', 'Рб', 100) в переменную-отношение SP (в результате чего новый кортеж появит­ся и в представлении).

Замечание. Предположим на мгновение, что в переменной-отношении SP возмож­но наличие кортежей, не имеющих соответствующих кортежей в переменной-отношении S. Более того, предположим, что переменная-отношение SP уже со­держит несколько кортежей с номером поставщика 'S6' (но в этой переменной-отношении отсутствует кортеж с номером поставщика 'S6' и номером детали 'Р1'). Тогда последняя из перечисленных операций вставки приведет к вставке в представление дополнительных кортежей, а именно: в нем появятся соединения кортежа ('S6', 'Green', 20, 'London') переменной-отношения S и тех корте­жей с номером поставщика 'S6', которые присутствовали в переменной-отношении SP ранее.

  • Попытка вставить в представление SSP кортеж ('S4', 'Clark', 20, 'Athens', ' Рб', 100) завершится неудачей (почему?).

  • Попытка вставить в представление SSP кортеж ('SI', 'Smith', 20, 'London', 'Pl', 400) завершится неудачей (почему?).

  • Попытка удалить из представления SSP кортеж ('S3', 'Blake', 30, 'Paris', 'Р2', 200) завершится успешно и приведет к удалению кортежа ('S3', 'Blake', 30, 'Paris') из переменной-отношения S и кортежа ('S3', 'Р2', 200) из пере­менной-отношения SP.

  • Попытка удалить из представления SSP кортеж ('SI', 'Smith', 20, 'London', 'PI', 300) завершится успешно (условно!) (см. замечание ниже) и приведет к удалению кортежа ('SI', 'Smith', 20, 'London') из переменной-отношения S и кортежа ('SI', 'Р1', 300) из переменной-отношения SP.

Замечание. На самом деле общий результат приведенной операции удаления будет зависеть от установленного правила удаления внешнего ключа между отношения­ми поставок и поставщиков. Если указана опция RESTRICT, то данная операция удаления завершится ошибкой. Если указана опция CASCADE, то операция удаления будет иметь побочный эффект, который выразится в удалении из переменной-отношения SP дополнительно всех остальных кортежей (а значит, и кортежей представления SSP), содержащих данные о поставщике с номером 'S1'.

  • Попытка обновить в представлении SSP кортеж ('SI', 'Smith', 20, 'London', 'PI', 300) к виду ('SI', 'Smith', 20, 'London', 'РГ, 400) будет успешно завершена и приведет к обновлению кортежа ('SI', 'Р1', 300) в переменной-отношении SP к виду ('S1', 'РГ, 400).

  • Попытка обновить в представлении SSP кортеж ('SI', 'Smith', 20, 'London', 'PI', 300) к виду ('SI', 'Smith', 20, 'Athens', 'РГ, 400) будет успешно завершена и приведет к обновлению кортежа ('SI', 'Smith', 20, 'London') в переменной-отношении S к виду ('SI', 'Smith', 20, 'Athens') и кортежа ('S1', 'РГ, 300) в переменной-отношении SP к виду ('S1', 'РГ, 400).

  • Попытка обновить в представлении SSP кортеж ('SI', 'Smith', 20, 'London', 'РГ, 300) к виду ('S6', 'Smith', 20, 'London', 'РГ, 300) будет успешно завершена (условно!) (см. замечание ниже) и приведет к обновлению кортежа ('SI', 'Smith', 20, 'London') в переменной-отношении S к виду ('S6', 'Smith', 20, 'London') и кортежа ('Si', 'РГ, 300) в переменной-отношении ЭРквиду ('S6', 'РГ, 300).

Замечание. На самом деле общий эффект приведенной выше операции обновле­ния будет зависеть от установленного правила обновления внешнего ключа между отношениями поставок и поставщиков. Детальное рассмотрение этого вопроса мы оставляем читателю в качестве упражнения.

Соединения типа "многие ко многим"

Здесь термин "многие ко многим" следует заменить более точным термином "(нуль или многие) к (нулю или многим)". Другими словами, не существует стандартного огра­ничения целостности, которое могло бы дать гарантии, аналогичные тем, которые мы имели в случае соединений первого или второго типа.

Примеры. Предположим, что обсуждаемое представление определено с помощью следующего выражения.

S JOIN Р

Это соединение переменных-отношений S и Р по атрибуту CITY имеет тип "многие ко многим". Пример содержимого данного представления показан на рис. 9.8.

s#

SNAME

STATUS

CITY

P#

PNAME

COLOR

WEIGHT

SI

Smith

20

London

PI

Nut

Red

12.0

SI

Smith

20

London

P4

Screw

Red

14.0

SI

Smith

20

London

P6

Cog

Red

19.0

S2

Jones

10

Paris

P2

Bolt

Green

17.0

S2

Jones

10

Paris

P5

Cam

Blue

12.0

S3

Blake

30

Paris

P2

Bolt

Green

17.0

S3

Blake

30

Paris

P5

Cam

Blue

12.0

S4

Clark

20

London

PI

Nut

Red

12.0

S4

Clark

20

London

P4

Screw

Red

14.0

S4

Clark

20

London

P6

Cog

Red

19.0

Рис. 9.8. Соединение переменных-отношений S и P no атрибуту CITY

  • Вставка в представление кортежа ('S7', 'Bruce', 15, 'Oslo', 'Р8', 'Wheel', 'White', 25) будет успешно завершена и приведет к вставке кортежа ('S7', 'Bruce', 15, 'Oslo') в переменную-отношение S и кортежа ('Р8', 'Wheel', 'White', 25, 'Oslo') в переменную-отношение Р (в результате указанный кор­теж попадет в представление).

  • Вставка в представление кортежа ('SI', 'Smith', 20, 'London', 'Р7', 'Washer', 'Red', 5) будет успешно завершена и приведет к вставке кортежа ('Р7', 'Washer', 'Red', 5, 'London') в переменную-отношение Р (в результате чего в представление попадут два кортежа—-('SI', 'Smith', 20, 'London', 'Р7', 'Washer', 'Red', 5)h('S4', 'Clark', 20, 'London', 'P7', 'Washer', 'Red', 5)).

  • Вставка в представление кортежа i'S6', 'Green', 20, 'London', 'P7', 'Washer', 'Red', 5) будет успешно завершена и приведет к вставке кортежа ('S6', 'Green', 20, 'London') в переменную-отношение S и кортежа ('Р7', 'Washer', 'Red', 5, 'London') в переменную-отношение Р (в результате в представление будет добавлено шесть новых кортежей).

  • Удаление из представления кортежа ('SI', 'Smith', 20, 'London', 'PI', 'Nut', 'Red', 12) будет успешно завершено и приведет к удалению кортежа ('SI', 'Smith', 20, 'London') из переменной-отношения S и кортежа {'Р1', 'Nut', 'Red', 12, 'London') из переменной-отношения Р (в результате из пред­ставления будут удалены четыре кортежа).

Дополнительные примеры читателю предлагается подготовить самостоятельно в ка­честве упражнения.

Прочие операции

В этом разделе кратко описаны случаи использования в представлениях остальных операций реляционной алгебры. Прежде всего, отметим, что операции 9-соединения, полусоединения, полувычитания и деления не примитивные, поэтому правила для них могут быть производными от правил для тех операций, в терминах которых они опреде­лены. Относительно других операций можно сказать следующее.

  • Переименование. Тривиальный случай.

  • Декартово произведение. Как уже отмечалось в конце раздела 6.4 главы 6, декар­тово произведение является частным случаем естественного соединения (операция A JOIN В вырождается в операцию A TIMES В, если отношения А и В не имеют общих атрибутов). Поэтому правила обновления для операции декартова произве­дения (A TIMES В) являются частным случаем правил обновления для операции соединения (конечно, как и правила обновления для операции пересечения A INTERSECT В).

  • Обобщение. Операция обобщения (SUMMARIZE) тоже не является примитивной и определяется в терминах операции расширения. Поэтому правила обновления для операции обобщения являются производными от правил обновления для опе­рации расширения.

Замечание. Для большинства представлений, определенных с использованием операции обобщения, подавляющая часть обновлений фактически неприменима. Однако причина заключается не в том, что такие представления не обновляемы по своей сути. Попытки их обновления обычно завершаются неудачно из-за проти­воречий с некоторыми установленными ограничениями целостности. Например, пусть для определения представления используется следующее выражение.

SUMMARIZE SP PER SP { St } ADD SUM ( QTY ) AS TOTQTY

Тогда попытка удаления кортежа, скажем, для поставщика с номером 'S1', будет вполне успешной. Однако попытка вставки кортежа, скажем, (' S5', 500), приведет к ошибке, поскольку эта попытка нарушает ограничение, согласно которому значение ат­рибута TOTQTY должно быть равным сумме всех соответствующих отдельных значений QTY. Попытка вставить кортеж ('S5', 0) тоже приведет к ошибке, но уже по другой причине (по какой?).

  • Группирование и разгруппирование. Все замечания, которые были сделаны для операции подведения итогов, справедливы и для этих операций.

  • Транзитивное замыкание. Почти такие же замечания применимы и в данном случае.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]