- •Часть 5
- •Глава 17 Представления
- •17.1. Введение
- •17.2. Для чего нужны представления
- •17.3. Определение данных
- •17.4. Манипуляции с данными: операции выборки
- •17.5. Манипуляции с данными: операции обновления
- •17.6. Обновление операций объединения, пересечения и вычитания
- •Объединение
- •Пересечение
- •17.7. Обновление представлений других видов
- •17.8. Снимки
- •17.9. Поддержка sql
- •17.10. Резюме
Пересечение
Приведем правила обновления представлений вида A intersect В. Причем в данном случае ограничимся только формулированием правил без каких-либо дополнительных пояснений (они аналогичны пояснениям для правил обновления объединений). Единственное, о чем следует помнить, — это то, что для представлений вида A intersect В предикат примет вид (PA) AND (РВ). Примеры для приведенных ниже правил предлагается создать читателю в качестве упражнения.
• INSERT. Новый кортеж должен удовлетворять предикатам РА и РВ. Если новый кортеж не входит в А, то этот кортеж будет вставлен в А (заметьте, что операция вставки может иметь побочный эффект, вследствие которого новый кортеж появится и в В). Если (все же) новый кортеж не входит в В, то он вставляется и в В.
• DELETE. Кортеж, который нужно удалить из представления, удаляется из А (заметьте, что операция удаления может иметь побочный эффект, в результате которого удаляемый кортеж исчезнет и из В). Если (все же) кортеж не удален из В, то он удаляется и из В.
• UPDATE. Обновляемый кортеж должен быть таким, чтобы его обновленная версия удовлетворяла оба предиката, РА и РВ. Кортеж удаляется из А без запуска триггеров и выполнения проверок предикатов отношений (заметьте, что эта операция может иметь побочный эффект, вследствие которого кортеж будет удален и из В). Если до этого момента кортеж не был удален из В, то этот кортеж удаляют из В, опять без запуска триггеров и без проверок предикатов. Далее, если обновленная версия кортежа не присутствует в А, эта версия кортежа вставляется в А (заметьте, что операция вставки также может иметь побочный эффект, вследствие которого новый кортеж появится и в В). Если (все же) новый кортеж не входит в В, то он вставляется и в В.
Вычитание
Ниже приведены правила обновления представлений вида A minus В (для представлений данного вида предикат отношения можно записать так: (PA) AND NOT (PB)).
• INSERT. Новый кортеж должен удовлетворять предикату РА и не должен удовлетворять предикату РВ. Новый кортеж вставляется в А.
• DELETE. Кортеж, который нужно удалить из представления, удаляется из А.
• UPDATE. Обновляемый кортеж должен быть таким, чтобы его обновленная версия удовлетворяла предикату РА и не удовлетворяла предикату РВ. Кортеж удаляется из А без запуска триггеров и выполнения проверок предикатов. Обновленная версия кортежа вставляется в А.
17.7. Обновление представлений других видов
Ниже рассматриваются оставшиеся операции реляционной алгебры — выборка, проекция, соединение и т.п.
Выборка
Рассмотрим операцию выборки общего вида:
A WHERE условие
Предикат отношения, которое является результатом показанной операции выборки, примет следующий вид: (PA) AND (условие). Например, предикат отношения для выборки s where city = 'London' примет вид (ps) and (city = 'London'), где PS является предикатом отношения S. Из этого следует, например, что любой кортеж t, выбранный для вставки в представление, которое определено как выборка, должен удовлетворять условиям PS(t) и t.CITY = 'London', в противном случае операция insert завершится неудачей.
Приведем правила обновления представлений вида A where условие.
• INSERT. Новый кортеж должен удовлетворять предикату РА и условию. Новый кортеж вставляется в А.
• DELETE. Кортеж, который нужно удалить, удаляется из А.
• UPDATE. Обновляемый кортеж должен быть таким, чтобы его обновленная версия удовлетворяла предикату РА и условию. Кортеж удаляется из А без запуска триггеров и выполнения проверок предикатов. Обновленная версия кортежа вставляется в А.
Примеры. Пусть представление LS определено следующим образом:
S WHERE CITY = 'London'
На рис. 17.4 показана таблица значений этого представления
LS
|
|
| |||
S#
|
SNAME
|
STATUS
|
CITY
| ||
S1 S4
|
Smith Clark
|
20 20
|
London London
| ||
|
|
|
|
Рис. 17.4. Представление LS (значения для примера)
• Попытка вставить кортеж (S6, Green, 20, London) в представление LS будет выполнена успешно. Новый кортеж будет вставлен в отношение S и, следовательно, появится в представлении LS.
• Попытка вставить кортеж (S 1, Green, 20, London) завершится неудачей, так как этот кортеж не удовлетворяет предикат отношения S (и, следовательно, представления LS). В частности, этот кортеж нарушает правило уникальности потенциального ключа в атрибуте S.S#.
• Попытка вставить кортеж (S6, Green, 20, Athens) завершится неудачей, так как этот кортеж не удовлетворяет условию city = 'London'.
• Попытка удалить из представления LS кортеж (S1, Smith, 20, London) будет выполнена успешно. Кортеж будет удален из отношения S и, следовательно, из представления LS.
• Попытка обновить кортеж (S 1, Smith, 20, London) кортежем (S6, Green, 20, London) будет выполнена успешно. Попытка обновить кортеж (S1, Smith, 20, London) кортежем (S2, Smith, 20, London) или кортежем (S 1, Smith, 20, Athens) потерпит неудачу (ответьте, почему это происходит в каждом случае?).
Проекция
Этот раздел также начнется с записи соответствующего предиката. Пусть атрибуты отношения А разделены на две несвязанные группы — Х и У. Будем рассматривать Х и У как составные атрибуты. Следовательно, данный кортеж {Х:х} появится в проекции А[Х] тогда и только тогда, когда существует значение y из области значений атрибута Y, такое что кортеж [Х:х, У:у] входит в А. Например, рассмотрим проекцию описанного ранее отношения S по атрибутам S#, SNAME и CITY. Для каждого кортежа (s, п, с), который входит в проекцию, существует значение статуса t, такое что кортеж (s, n, t, с) принадлежит отношению S.
Ниже приведены правила обновления проекций.
• INSERT. Пусть (х) — кортеж, который нужно вставить, и пусть y — значение по умолчанию, выбираемое из области значений Y (если такого значения по умолчанию не существует, т.е. применяется правило "запретить значения по умолчанию", то это ошибка). Кортеж (ж, у), который должен удовлетворять предикату РА, будет вставлен в A.
Замечание. Так как для потенциальных ключей обычно (но не всегда) применяется правило "запретить значения по умолчанию", то представление, которое содержит не все потенциальные ключи исходного отношения, обычно не разрешает выполнять операции insert.
• DELETE. Из А будут удалены все кортежи, в которых значение Х совпадает со значением Х в удаляемом из представления А[Х] кортеже.
Замечание. На практике желательно, чтобы множество атрибутов А" включало хотя бы один потенциальный ключ, тогда удаляемому из проекции А [Х] кортежу будет соответствовать единственный кортеж а в отношении А. Тем не менее, нет никаких логических причин превращать это пожелание в жесткое требование. Аналогичные соображения также применимы к операции update (см. ниже).
• UPDATE. Пусть (х)— кортеж, который нужно обновить, а (x')— обновленная версия кортежа (х). Пусть а— кортеж отношения А, в котором то же значение х атрибута X. Пусть у — значение атрибута Y в кортеже А. Сначала из А будут удалены все подобные кортежи а без запуска триггеров и без выполнения проверок предикатов отношений. После этого в отношение А для каждого значения у будет вставлен кортеж (х', у), который удовлетворяет предикату РА.
Замечание. Здесь продемонстрированы "незначительные усовершенствования", которые упоминались в принципах обновления выше в этой главе. В частности, следует заметить, что последний этап вставки в правиле для операции update восстанавливает предыдущее значение атрибута Y в каждом вставляемом кортеже — это правило не заменяет предыдущее значение атрибута У значением, используемым по умолчанию, как это делается при выполнении отдельных операций вставки.
Примеры. Пусть представление SC определено с помощью следующего выражения:
sc [ s#, city ]
На рис. 17.5 это представление показано в виде таблицы.
SC
|
|
| |
s#
|
CITY
| ||
|
S1
|
London
|
|
|
32
|
Paris
|
|
|
S3
|
Paris
|
|
|
S4
|
London
|
|
|
S5
|
Athens
|
|
|
|
Рис. 17.5. Представление SC (значения для примера)
• Попытка вставить в представление SC кортеж (S6, London) будет успешно выполнена. В результате этой операции в отношение S будет вставлен кортеж (S6, п, t, London), где п и / являются значениями, которые используются по умолчанию для атрибутов S.SNAME и S.STATUS соответственно.
• Попытка вставить кортеж (S1, London) в представление SC завершится неудачей, так как этот кортеж не удовлетворяет предикату отношения S (и, следовательно, представления SC). В частности, этот кортеж нарушает правило уникальности потенциального ключа в атрибуте S.S#.
• Попытка удалить из представления SC кортеж (S1, London) будет выполнена успешно. Кортеж будет удален из отношения S.
• Попытка обновить кортеж (S1, London) кортежем (S1, Athens) будет выполнена успешно. Это приведет к замене в отношении S кортежа (S1, Smith, 20, London) кортежем (S1, Smith, 20, Athens), а не (S1, п, t, Athens), пожалуйста, запомните это.
• Попытка обновить в SC тот же кортеж (S1, London) кортежем (S2, London) завершится неудачей (укажите причину).
Случай, когда проекция не включает потенциальных ключей исходного отношения (например, проекция отношения S по атрибутам STATUS и CITY), оставлен для рассмотрения читателями в качестве упражнения.
Расширение
Предикат РЕ отношения Е, которое является результатом операции расширения
EXTEND A ADD exp AS X,
примет следующий вид:
PA ( а ) AND е.Х = exp ( a )
Здесь е— это кортеж отношения Е, а а— проекция кортежа е по всем атрибутам отношения А. Иначе это можно сформулировать следующим образом:
Каждый кортеж е в "расширенном" отношении такой, что: 1) кортеж а является порождением кортежа е посредством проекции, исключающей значение е.Х, и удовлетворяет предикату РА; 2) значение е.Х равно результату выражения еxp от кортежа а.
Приведем правила обновления представления вида Е = extend A add exp as X.
• INSERT. Пусть е — кортеж, который нужно вставить. Этот кортеж должен удовлетворять предикату РЕ. В А будет вставлен кортеж о, порожденный кортежем е посредством проекции, исключающей значение е.Х.
• DELETE. Пусть е — кортеж, который нужно удалить. Из А будет удален кортеж а, порожденный кортежем е посредством проекции, исключающей значение е.Х.
• UPDATE. Пусть е— кортеж, который нужно обновить, a e'— обновленная версия кортежа е. Сначала из А без запуска триггеров и без выполнения проверок предикатов отношений будет удален кортеж а, порожденный кортежем е посредством проекции, исключающей значение е.Х. Затем в А будет вставлен кортеж а', порожденный кортежем е' посредством проекции, исключающей значение e'.X.
Примеры. Пусть представление РХ определено с помощью следующего выражения:
EXTEND P ADD ( WEIGHT * 454 ) AS GMWT
На рис. 17.6 приведена таблица значений представления РХ.
РХ
|
|
| |||||
р#
|
PNAME
|
COLOR
|
WEIGHT
|
CITY
|
GMWT
| ||
|
pi
|
Nut
|
Red
|
12
|
London
|
5448
|
|
|
Р2
|
Bolt
|
Green
|
11
|
Paris
|
7718
|
|
|
РЗ
|
Screw
|
Blue
|
17
|
Rome
|
7718
|
|
|
Р4
|
Screw
|
Red
|
14
|
London
|
6356
|
|
|
Р5
|
Cam
|
Blue
|
12
|
Paris
|
5448
|
|
|
Р6
|
Cog
|
Red
|
19
|
London
|
8626
|
|
|
Рис. 17.6. Представление РХ (значения для примера)
• Попытка вставить кортеж (Р7, Cog, Red, 12, Paris, 5448) будет завершена успешно и приведет к вставке кортежа (Р7, Cog, Red, 12, Paris) в отношение Р.
• Попытка вставить кортеж (Р7, Cog, Red, 12, Paris, 5449) потерпит неудачу (почему?).
• Попытка вставить кортеж (PI, Cog, Red, 12, Paris, 5448) потерпит неудачу (почему?).
• Попытка удалить кортеж с ключом Р1 будет завершена успешно и приведет к удалению кортежа с ключом Р1 из отношения Р.
• Попытка обновить кортеж с ключом Р1 кортежем (PI, Nut, Red, 10, Paris, 4540) будет завершена успешно и приведет к замене кортежа (PI, Nut, Red, 12, London) в отношении Р кортежем (PI, Nut, Red, 10, Paris).
• Закончится неудачей попытка обновить тот же кортеж кортежем с ключом Р2 (и неизменными остальными атрибутами) или кортежем, в котором значение атрибута GMWT не равно значению атрибута WEIGHT, умноженному на 454 (в каждом случае укажите причину неудачи).
Соединение
Большинство трактовок проблемы обновления представлений, включая трактовки, рассмотренные в предыдущих редакциях этой книги и в других книгах данного автора, доказывают, что обновляемость или ее отсутствие для представления зависят, по крайней мере частично, от того, принадлежит ли соединение к типу один-к-одно.иу, один-ко-многим или многие-ко-многим. В отличие от всех предыдущих подходов к решению проблемы обновления представлений, автор утверждает, что соединения всегда обновляемы. Более того, для всех трех перечисленных типов соединений правила идентичны и в основном достаточно прямые.
Это утверждение делает вероятным (поразительно даже с первого взгляда) новое видение проблемы, благодаря адаптации изложенных выше в этой главе фундаментальных принципов к эффекту, который состоит в том, что предикат данного отношения является критерием обновляемости этого отношения. Вообще говоря, цель поддержки представлений всегда состояла в стремлении по возможности стереть разницу между представлениями и базовыми отношениями, и это похвально. Тем не менее:
• всегда предполагалось (неявно), что можно обновить отдельный кортеж базового отношения, не влияя на остальные кортежи этого отношения;
• в то же время очевидно, что не всегда возможно обновить отдельный кортеж представления, не влияя на остальные кортежи этого представления.
Например, в [10.2] Кодд (Codd) показал, что из конкретного соединения невозможно удалить единственный кортеж, так как это приведет к получению отношения, которое "не является соединением двух любых отношений" (это, в свою очередь, означает, что результат, возможно, не будет удовлетворять предикату представления). Исторически сложилось так, что подобные операции обновления представлений отбрасывались ввиду невозможности сделать эти операции полностью идентичными обновлениям базовых отношений.
Наш подход значительно отличается. Мы признаем тот факт, что даже в базовых отношениях не всегда возможно обновить отдельный кортеж независимо от остальных кортежей. Следовательно, рассматриваемый подход позволяет принять операции обновления представлений, которые по сложившейся традиции не рассматривались, и интерпретировать эти операции четко и логически корректно для применения к исходным отношениям представлений. Более того, операции обновления рассматриваются с учетом побочных эффектов, которые может иметь обновление исходных отношений для представления. Тем не менее, такие побочные эффекты необходимы, так как в противном случае представление может не удовлетворять собственному предикату.
Закончив вступительную часть, давайте перейдем к детальному обсуждению. Прежде всего, определим термины. После этого приведем правила для обновления представлений на базе соединения. Затем рассмотрим применение этих правил для всех трех типов соединений (один-к-одному, один-ко-многим, многие-ко-многим).
Рассмотрим соединение J = A join В, где отношения А, В и J имеют заголовки {X, Y}, {Y, Z} и {X, Y, Z} соответственно. Пусть РА и РВ — предикаты для отношений А и В соответственно. Тогда предикат PJ представления J имеет следующий вид:
PA ( a ) AND РВ ( b ),
где а является "A-частью" данного кортежа j (т.е. кортежем, который порожден от j посредством проекции, исключающей значение j.Z), В является "B-частью" кортежа j (т.е. кортежем, который порожден от j посредством проекции, исключающей значение j.X). Другими словами:
Каждый кортеж в соединении таков, что A-часть удовлетворяет предикату PA, a B-часть удовлетворяет предикату РВ.
Например, предикат для соединения часто обсуждаемых в этой книге отношений S и SP по атрибуту S# можно сформулировать так:
Каждый кортеж (s, n, t, с, р, q) в соединении таков, что кортеж (s, n, t, с) удовлетворяет предикату отношения S и кортеж (s, р, q) удовлетворяет предикату отношения SP.
Приведем правила для обновления представлений вида J = A join В.
• INSERT. Новый кортежу должен удовлетворять предикату PJ. Если A-часть кортежа у не входит в А, то А-частъ вставляется в А(///). Если B-часть не присутствует в В, то B-часть вставляется в В.
• DELETE. А-часть удаляемого кортежа удаляется из А. В-часть удаляемого кортежа удаляется из В.
• UPDATE. Обновляемый кортеж должен быть таким, чтобы его обновленная версия удовлетворяла PJ. A-часть удаляется из А без запуска каких-либо триггеров и без выполнения проверок предикатов, B-часть удаляется из В опять же без запуска каких-либо триггеров и без выполнения проверок предикатов. Если после этого A-часть обновленного кортежа не входит в А, то А-частъ вставляется в А. Если B-часть не присутствует в В, то B-часть вставляется в В.
//// Заметьте, что операция INSERT может иметь побочный эффект, вследствие которого B-часть кортежа у будет вставлена в В, как в случае с представлениями, описанными выше. Аналогичные соображения применимы к правилам для операций DELETE и UPDATE. Для краткости возможность побочных эффектов не будет упоминаться в каждом правиле./////
Теперь проверим применение сформулированных правил на трех типах соединений. Тип 1 (один-к-одному). Заметьте, что в данном случае термин "один-к-одному" можно заменить более точным термином "(один-или-нуль)-к-(одному-или-нулю)". Другими словами, существует стандартное для СУБД ограничение целостности, гарантирующее, что для каждого кортежа из А существует по крайней мере один соответствующий кортеж из В и наоборот. Точнее, множество атрибутов Y, по которому выполняется соединение, должно содержать подмножество К такое, что К является потенциальным ключом для А и для В.
Примеры:
• В качестве первого примера читателю предлагается рассмотреть эффект применения правил на соединении отношения S (с информацией о поставщиках) с самим собой только по номеру поставщика (атрибут S#).
• Рассмотрим второй пример. Предположим, что база данных поставщиков и деталей содержит еще одно отношение SR { S#, REST }, где атрибут S# идентифицирует поставщика, а атрибут REST содержит информацию о любимом ресторане поставщика. Предположим, что не все поставщики представлены в отношении SR. Читателю предлагается рассмотреть эффект применения изложенных правил на соединении отношений S и SR (по атрибуту S#). Что изменится, если поставщик будет представлен в отношении SR и не будет представлен в отношении S?
Тип 2 (один-ко-многи-м). Термин "один-ко-многим" можно заменить более точным термином "(нуль-или-один)-к-(нулю-или-многим)". Другими словами, существует стандартное для СУБД ограничение целостности, гарантирующее, что для каждого кортежа из В существует не более одного соответствующего кортежа в А. Точнее, множество атрибутов Y, по которому выполняется соединение, должно содержать подмножество К, такое что К является потенциальным ключом для А и соответствующим внешним ключом для В.
Замечание. Если сформулированные выше требования выполняются и если внешний ключ определен с помощью инструкции nulls not allowed, то выражение "нуль или один" можно заменить выражением "точно один".
Примеры. Пусть представление SSP определено следующим выражением:
s join sp
Это, конечно, соединение с внешним согласованным потенциальным ключом. Образцы данных представления SSP показаны на рис. 17.7.
SSP
|
|
| |||||
S#
|
SNAME
|
STATUS
|
CITY
|
P#
|
OTY
| ||
|
Sl
|
Smith
|
20
|
London
|
PI
|
300
|
|
|
Sl
|
Smith
|
20
|
London
|
P2
|
200
|
|
|
Sl
|
Smith
|
20
|
London
|
P3
|
400
|
|
|
Sl
|
Smith
|
20
|
London
|
P4
|
200
|
|
|
Sl
|
Smith
|
20
|
London
|
P5
|
100
|
|
|
Sl
|
Smith
|
20
|
London
|
P6
|
100
|
|
|
S2
|
Jones
|
10
|
Paris
|
PI
|
300
|
|
|
S2
|
Jones
|
10
|
Paris
|
P2
|
400
|
|
|
s3
|
Blake
|
30
|
Paris
|
P2
|
200
|
|
|
S4
|
dark
|
20
|
London
|
P2
|
200
|
|
|
S4
|
dark
|
20
|
London
|
P4
|
300
|
|
|
S4
|
dark
|
20
|
London
|
P5
|
400
|
|
|
|
|
|
|
|
Рис. 17.7. Представление SSP (значения для примера)
• Попытка вставить кортеж (S4, dark, 20, London, P6, 100) в представление SSP будет завершена успешно и приведет к вставке кортежа (S4, P6, 100) в отношение SP (следовательно, новый кортеж появится в представлении).
• Попытка вставить кортеж (S5, Adams, 30, Athens, P6, 100) в представление SSP будет завершена успешно и приведет к вставке кортежа (S5, P6, 100) в отношение SP (следовательно, новый кортеж появится в представлении).
• Попытка вставить кортеж (S6, Green, 20, London, P6, 100) в представление SSP будет завершена успешно и приведет к вставке кортежа (S6, Green, 20, London) в отношение S и к вставке кортежа (S6, P6, 100) в отношение SP (следовательно, новый кортеж появится в представлении).
Замечание. Предположим на мгновение, что возможно присутствие кортежей в отношении SP без соответствующих кортежей в отношении S. Более того, предположим, что отношение SP уже содержит несколько кортежей с номером поставщика S6 (но в этом отношении отсутствует кортеж с поставщиком S6 и деталью Р1). Тогда последняя из перечисленных операций вставки приведет к вставке дополнительных кортежей в представление, а именно: в отношении появятся соединения кортежа (S6, Green, 20, London) и тех кортежей поставщика S6, которые ранее присутствовали в отношении SP.
• Попытка вставить кортеж (S4, dark, 20, Athens, P6, 100) в представление SSP завершится неудачей (почему?).
• Попытка вставить кортеж (S5, Adams, 30, London, P6, 100) в представление SSP завершится неудачей (почему?).
• Попытка вставить кортеж (Sl, Smith, 20, London, PI, 400) в представление SSP завершится неудачей (почему?).
• Попытка удалить кортеж (S3, Blake, 30, Paris, P2, 200) из представления SSP будет выполнена успешно и приведет к удалению кортежа (S3, Blake, 30, Paris) из отношения S и кортежа (S3, P2, 200) из отношения SP.
• Попытка удалить кортеж (S 1, Smith, 20, London, P 1, 300) из представления SSP условно будет выполнена успешно (см. замечание ниже) и приведет к удалению кортежа (Sl, Smith, 20, London) из отношения S и кортежа (Sl, P1,300) из отношения SP.
Замечание. На самом деле общий эффект приведенной операции удаления будет зависеть от правила удаления внешнего ключа из SP.S# в S.S#. Если используется правило restrict, то операция удаления завершится неудачей. Если используется правило cascade, то удаление будет иметь побочный эффект, который приведет к удалению из отношения SP других кортежей, содержащих данные о поставщике Sl.
• Попытка обновить кортеж (Sl, Smith, 20, London, P1, 300) в представлении SSP кортежем (Sl, Smith, 20, London, PI, 400) будет успешно завершена и приведет к обновлению кортежа (Sl, P1, 300) в отношении SP кортежем (Sl, P1, 400).
• Попытка обновить кортеж (Sl, Smith, 20, London, PI, 300) в представлении SSP кортежем (Sl, Smith, 20, Athens, PI, 400) будет успешно завершена и приведет к обновлению кортежа (Sl, Smith, 20, London) в отношении S кортежем (Sl, Smith, 20, Athens) и кортежа (Sl, P1,300) в отношении SP кортежем (Sl, P1,400).
• Попытка обновить кортеж (Sl, Smith, 20, London, P1, 300) в представлении SSP кортежем (S6, Smith, 20, London, PI, 300) будет условно успешно завершена (см. замечание ниже) и приведет к обновлению кортежа (Sl, Smith, 20, London) в отношении S кортежем (S6, Smith, 20, London) и кортежа (Sl, PI, 300) в отношении SP кортежем (S6, P1, 300).
Замечание. На самом деле эффект приведенной операции обновления будет зависеть от правила обновления внешнего ключа из SP.S# в S.S#. Детальное рассмотрение оставлено в качестве упражнения читателю.
Тип 3 (многие-ко-.многи.м). Термин "многие-ко-многим" можно заменить более точным термином "(нуль-или-многие)-к-(нулю-или-многим)". Другими словами, не существует стандартного для СУБД ограничения целостности, которое гарантирует, что данный тип соединения не относится ни к первому, ни ко второму типу соединений.
Примеры. Предположим, что представление определено следующим выражением:
S JOIN P
Это соединение отношений S и Р по атрибуту CITY. Образцы данных показаны на рис.17.8.
|
|
| |||||||
s#
|
SNAME
|
STATUS
|
CITY
|
P#
|
PNAME
|
COLOR
|
WEIGHT
| ||
|
Sl
|
Smith
|
20
|
London
|
PI
|
Nut
|
Red
|
12
|
|
|
Sl
|
Smith
|
20
|
London
|
P4
|
Screw
|
Red
|
14
|
|
|
Sl
|
Smith
|
20
|
London
|
P6
|
Cog
|
Red
|
19
|
|
|
S2
|
Jones
|
10
|
Paris
|
P2
|
Bolt
|
Green
|
17
|
|
|
S2
|
Jones
|
10
|
Paris
|
P5
|
Cam
|
Blue
|
12
|
|
|
S3
|
Blake
|
30
|
Paris
|
P2
|
Bolt
|
Green
|
17
|
|
|
S3
|
Blake
|
30
|
Paris
|
P5
|
Cam
|
Blue
|
12
|
|
|
S4
|
dark
|
20
|
London
|
PI
|
Nut
|
Red
|
12
|
|
|
S4
|
dark
|
20
|
London
|
P4
|
Screw
|
Red
|
14
|
|
|
S4
|
dark
|
20
|
London
|
P6
|
Cog
|
Red
|
19
|
|
|
Рис. 17.8. Соединение отношений S и Р по атрибуту CITY
• Вставка кортежа (S7, Bruce, 15, Oslo, P8, Wheel, White, 25) будет успешно завершена и приведет к вставке кортежа (S7, Bruce, 15, Oslo) в отношение S и кортежа (P8, Wheel, White, 25, Oslo) в отношение Р (следовательно, указанный кортеж попадет в представление).
• Вставка кортежа (Sl, Smith, 20, London, P7, Washer, Red, 5) будет успешно завершена и приведет к вставке кортежа (P7, Washer, Red, 5, London) в отношение Р (следовательно, в представление попадет два кортежа— (Sl, Smith, 20, London, P7, Washer, Red, 5) и (S4, dark, 20, London, P7, Washer, Red, 5)).
• Вставка кортежа (S6, Green, 20, London, P7, Washer, Red, 5) будет успешно завершена и приведет к вставке кортежа (S6, Green, 20, London) в отношение S и кортежа (P7, Washer, Red, 5, London) в отношение Р (следовательно, в представление попадет шесть кортежей).
• Удаление кортежа (Sl, Smith, 20, London, PI, Nut, Red, 12) будет успешно завершено и приведет к удалению кортежа (Sl, Smith, 20, London) из отношения S и кортежа (Р 1, Nut, Red, 12, London) из отношения Р (следовательно, из представления исчезнет четыре кортежа).
Остальные примеры в качестве упражнения предлагается создать читателю.
Другие операции
В этом разделе кратко описаны оставшиеся операции реляционной алгебры: декартово произведение, 9-соединение, переименование, деление и операция подведения итогов.
• Декартово произведение. Так как декартово произведение является частным случаем естественного соединения (A join В вырождается в A times Д, если А и В не имеют общих атрибутов), то правила для декартова произведения (A times В) являются частным случаем правил обновления соединений (A join В). Детальный анализ правил оставлен в качестве упражнения.
• -соединение. Это выборка декартова произведения. Следовательно, правила обновления таких представлений можно получить из правил обновления для декартовых произведений.
• Переименование. Тривиальный случай.
• Деление. Деление (как и -соединение) не совсем примитивная операция, поэтому соответствующие правила можно получить из уже изложенных (в частности, из правил для вычитания, проекции и декартова произведения). Как и прежде, детальное изложение правил для данной операции оставлено в качестве упражнения для читателя, но следует заметить, что представления, полученные с помощью операции деления, возможно, вообще не являются обновляемыми (точно укажите причину).
• Подведение итогов. В основном операция подведения итогов (summarize) не является операцией, сохраняющей информацию. Поэтому не существует однозначного обратного отображения из результата в исходное отношение. Следовательно, представления, которые определены с помощью операции summarize, не обновляемы.
Замечание о целевых отношениях
Завершим обсуждение проблемы обновления представлений следующим утверждением. Пусть, например, представление, построенное с помощью операции соединения, является обновляемым. Тогда нет никаких причин использовать в качестве целевых отношений в операциях insert, delete и update именованные отношения. Поэтому если выражение insert into ssp корректно (представление SSP приводилось выше в этой главе), то выражение insert into (s join sp) также должно быть корректным. Конечно, аналогичные соображения применимы и для реляционных операций присвоения.
Для демонстрации предположим, что представление LSSP определено с помощью следующего выражения:
( S WHERE CITY = 'London' ) JOIN SP
Исходя из обычных образцов данных, попытка вставить кортеж (S6, Green, 20, London, P6, 100) будет успешно завершена и приведет к вставке кортежа (S6, Green, 20, London) в отношение S и кортежа (S6, P6, 100) в отношение SP. Точнее, первый из двух кортежей — (S6, Green, 20, London) — будет вставлен не непосредственно в отношение S, а в выборку s where city = 'London'. Далее в игру вступает правило вставки кортежей в выборку, что и приводит к желаемому результату. Тем не менее, следует отметить один важный аспект: целевое отношение промежуточной операции insert представлено не именованным отношением, а выражением с операцией выборки.