- •7.7.6. Определить общее количество поставщиков
- •7.7.7. Определить в поставках максимальное
- •7.7.8. Для каждой поставляемой детали указать номер и общий объем поставки в штуках
- •7.7.9. Указать номера всех типов деталей, поставляемых более чем одним поставщиком
- •7.7.10. Определить имена поставщиков детали с номером т2'
- •7.7.11. Определить имена поставщиков по крайней мере одной красной детали
- •7.7.12. Указать номера поставщиков, статус которых меньше текущего максимального статуса
- •7.7.13. Указать имена поставщиков детали с номером 'р2'
- •7.7.14. Выбрать имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.7.15. Определить имена поставщиков всех типов деталей
- •7.7.16. Определить номера деталей, которые либо весят более 16 фунтов, либо поставляются поставщиком с номером 's2', либо и то, и другое
- •7.8. Резюме
- •8.2. Ограничения типа
- •8.3. Ограничения атрибута
- •8.4. Ограничения переменной-отношения
- •8.5. Ограничения баз данных
- •8.6. "Золотое правило"
- •8.7. Ограничения состояния и ограничения перехода
- •8.8. Ключи
- •3. Пусть r1 и r2 — ссылающаяся и ссылочная переменные-отношения соответственно.
- •8.9. Средства языка sql
- •8.10. Резюме
- •9.1. Введение
- •9.2. Для чего нужны представления
- •9.3. Выборка данных из представлений
- •9.4. Обновление данных в представлениях
- •9.5. Моментальные снимки
- •9.6. Поддержка представлений в языке sql
- •9.7. Резюме
- •Часть III
- •10.1. Введение
- •10.2. Основные определения
- •10.3. Тривиальные и нетривиальные зависимости
- •10.4. Замыкание множества зависимостей
- •10.5. Замыкание множества атрибутов
- •10.6. Неприводимые множества зависимостей
- •10.7. Резюме
- •Глава 1 1
- •I Переменные-отношения в знф I
- •11.2. Декомпозиция без потерь
- •11.3. Первая, вторая и третья нормальные формы
- •11.4. Сохранение зависимостей
- •11.5. Нормальная форма Бойса-Кодда
- •11.6. Замечание по поводу атрибутов, содержащих в качестве значений отношения
- •11.7. Резюме
- •12.1. Введение
- •12.2. Многозначные зависимости и четвертая нормальная форма
- •12.3. Зависимости соединения и пятая нормальная форма
- •Соединение по комбинации атрибутов j#,s#
- •Исходное состояние spj
- •12.4. Общая схема процедуры нормализации
- •12.5. Денормализация
- •12.6. Ортогональное проектирование (небольшое отступление от темы)
- •12.7. Другие нормальные формы
- •12.8. Резюме
- •12.3. Brosda V., Vossen g. Update and Retrieval Through a Universal Schema Interface // acm tods. — December, 1988. — 13, № 4.
- •12.5. Date c.J. Will the Real Fourth Normal Form Please Stand Up? // c. J. Date and Hugh Darwen. Relational Database Writings 1989-1991.— Reading, Mass.: Addison-Wesley, 1992.
- •12.20.Kent w. The Universal Relation Revisited // acm tods. — December, 1983. — 8, № 4.
- •12.22.Maier d., Ullman j.D. Fragments of Relations // Proc. 1983 sigmod Intern. Conf. On Management of Data. — San Jose, Calif. — May, 1983.
- •12.24.Maier d., Ullman j.D. Maximal Objects and the Semantics of Universal Relation Databases // acm tods. — March, 1983. — 8, № 1.
- •Глава 13
- •13.1. Введение
- •13.2. Общий подход
- •Каждыи экземпляр сущности ности «Произведение"
- •13.3. Модель "сущность/связь"
- •13.5. Проектирование базы данных с помощью метода er-моделирования
- •13.6. Краткий анализ er-модели
- •13.7. Резюме
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 В, должны давать тот же результат, что и в случае, когда рассматриваемая операция обновления применяется непосредственно к базовой переменной-отношению В. Иначе говоря, хотя тема данного раздела и звучит как "обновление представлений", на самом деле в общем случае здесь рассматривается обновление переменных-отношений. Мы рассмотрим теорию обновления, применимую ко всем переменным-отношениям, а не только к представлениям,
Применяемые правила должны сохранять симметричность во всех случаях, когда она применима. Например, правило удаления DELETE для представления, определенного как пересечение V = A INTERSECT В, не должно допускать произвольного удаления кортежа из переменной-отношения А или В даже тогда, когда такое одностороннее удаление кортежа наверняка вызовет удаление этого кортежа из рассматриваемого представления. В подобном случае кортеж должен удаляться из обеих переменных-отношений А и В. (Другими словами, не должно быть никакой неоднозначности. Всегда должен существовать единственный способ реализации данного обновления, который срабатывает во всех случаях. В частности, не должно быть никаких логических различий между представлениями, определенными как A INTERSECT В и В INTERSECT А.)
В правилах обновления должны учитываться любые применимые триггерные процедуры, включая, в частности, определенные ссылочные действия, подобные "каскадному" удалению (устанавливаемому с помощью опции CASCADE).
Для упрощения синтаксиса желательно рассматривать операцию 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 в базовых переменных-отношениях, является истинным.
В общем случае правила обновления при их применении к заданному представлению V определяют операции, которые должны быть применены к переменным-отношениям, на которых определено данное представление V. Эти правила должны правильно срабатывать даже в том случае, когда те переменные-отношения, на основе которых определено данное представление, в свою очередь, также являются представлениями. Другим словами, правила должны допускать возможность рекурсивного применения. Конечно, если попытка обновить исходную переменную-отношение по каким-то причинам завершится неудачно, то и исходная операция обновления не будет выполнена. Другими словами, обновления в представлениях выполняются по принципу "все или ничего", точно так, как и в случае базовых переменных-отношений.
Правила не должны основываться на предположении, что база данных хорошо спроектирована, т.е. полностью нормализована (подробности приводятся в главах 11 и 12). Тем не менее выполнение установленных правил может привести к несколько неожиданным результатам, если база данных спроектирована неудачно. Это еще раз свидетельствует в пользу необходимости создания добротных проектов базы данных. В следующем разделе будет приведен подобный пример с несколько неожиданными результатами.
Не должно существовать никаких веских причин, чтобы в любом заданном представлении одни операции обновления разрешались, а другие — нет (например, разрешена операция DELETE, но запрещена операция INSERT).
10. Операции INSERT и DELETE должны быть, насколько это возможно, обратными по отношению одна к другой.
Необходимо сделать одно важное напоминание. Как было показано в главе 5, реляционные операции, в частности реляционные обновления, всегда выполняются на уровне множеств, а множество, состоящее из одного кортежа, просто является одним из частных случаев. Более того, иногда необходимо выполнить обновление сразу многих кортежей (например, если операцию обновления нельзя воспроизвести с помощью серии обновле
ний отдельных кортежей). Это утверждение в общем случае верно как для базовых переменных-отношений, так и для представлений. Для простоты изложения большую часть обсуждаемых правил обновления представлений мы будем формулировать в терминах операций обновления отдельных кортежей; тем не менее читатель не должен забывать о том, что подобный подход— это всего лишь дань простоте изложения, в некоторых случаях даже чрезмерная.
Далее мы по очереди рассмотрим отдельные операции реляционной алгебры (объединение, пересечение и вычитание), а затем — все остальные операции.
Замечание. В первых трех случаях, в частности, подразумевается, что речь идет о представлении, определяющее выражение которого имеет соответственно одну из следующих трех форм: A UNION В, A INTERSECT В и A MINUS В, где А и В, в свою очередь, являются некоторыми реляционными выражениями (т.е. необязательно представляют базовые переменные-отношения). Переменные-отношения А и В должны иметь один и тот же реляционный тип. Соответствующие предикаты данных переменных-отношений — это РА и РВ.
Операция объединения
Приведем правило вставки для представления вида A UNION В.
■ Правило INSERT. Вновь добавляемый кортеж должен удовлетворять либо предикату РА, либо предикату РВ, либо обоим предикатам одновременно. Если новый кортеж удовлетворяет предикату РА, то этот кортеж должен быть вставлен в переменную-отношение А (заметим, что операция вставки может иметь побочный эффект, в результате которого новый кортеж будет вставлен и в переменную-отношение В4). Если новый кортеж удовлетворяет предикату РВ, то он вставляется и в переменную-отношение В, но лишь в том случае, если он еще не вставлен в эту переменную-отношение в результате побочного эффекта от вставки кортежа в переменную-отношение А.
Замечание. Конкретное определение выполняемой процедуры, использованное при формулировке правила (вставить сначала в переменную-отношение А, а затем — в переменную-отношение В), следует воспринимать только как педагогический прием. Не нужно полагать, что СУБД должна будет выполнять операцию вставки именно в той последовательности, которая указана в определении правила. На самом деле это замечание следует из принципа симметрии (принцип 3 из предыдущего подраздела), поскольку при вставке кортежа ни одна из переменных-отношений А или В не имеет преимуществ перед другой. Аналогичные соображения относятся ко всем правилам, рассматриваемым в этом разделе.
В
нескольких обсуждаемых ниже правилах
и примерах отмечается возможность
возникновения побочных эффектов.
Конечно, всем известно, что побочные
эффекты обычно нежелательны. Однако
проблема заключается в том, что некоторых
побочных эффектов нельзя избежать,
если переменные-отношения А и В являются
пересекающимися подмножествами
кортежей одной и той же базовой
переменной-отношения. Подобная ситуация
часто встречается в представлениях,
определенных с помощью операций
объединения, пересечения или вычитания.
В этом конкретном случае упомянутые
побочные эффекты как раз желательны,
а не наоборот.
ной-отношения для объединения 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 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
").
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) тоже приведет к ошибке, но уже по другой причине (по какой?).
Группирование и разгруппирование. Все замечания, которые были сделаны для операции подведения итогов, справедливы и для этих операций.
Транзитивное замыкание. Почти такие же замечания применимы и в данном случае.