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

5.4. Переменные-отношения

Как уже говорилось в главе 3, существует две разновидности переменных-отношений (relation variable или кратко — relvar): базовые переменные-отношения и представления (которые иногда называют реальными и виртуальными переменными-отношениями со- ответственно). В этом разделе рассматриваются только базовые переменные-отношения. Представления будут обсуждаться в главе 9.

Определение базовых переменных-отношений

Базовые переменные-отношения определяются следующим образом.

VAR <имя переменной-отношения > BASE <тип отношение

<перечень определений потенциальных ключей> [ <переченъ определений внешних ключей> ] ;

Параметр <тип отношение имеет следующий вид. RELATION { <спнсок атрибутов> }

Здесь каждое значение <атрибут> в параметре <список атрибутов>, в свою очередь, является упорядоченной парой следующего вида.

<имя атри6ута> <имя типа>

Смысл выражения <перечень определений потенциальных ключей> и необязательно- го выражения <переченъ определений внешних ключей> раскрывается ниже.

Замечание. Термин <список ...> (список, разделенный запятыми) был определен в главе4 (раздел 4.6), а термин <переченъ ...> имеет следующее определение. Если <xyz> — это некоторая синтаксическая категория (т.е. что-либо, что записывается слева в BNF-нотации), то <перечень хуг> обозначает последовательность категорий <хуг>, количество которых больше нуля либо равно нулю, причем каждая соседняя пара этих определений разделяется по крайней мере одним пробелом.

В качестве примера рассмотрим несколько определений базовых отношений для базы данных поставщиков и деталей.

VAR S BASE RELATION { SI Si,

SNAME NAME,

STATUS INTEGER,

CITY CHAR } PRIMARY KEY { Si } ;

VAR P BASE RELATION { Pi Pi,

PNAME NAME,

COLOR COLOR,

WEIGHT WEIGHT,

CITY CHAR } PRIMARY KEY { Pi } ;

VAR SP BASE RELATION { Si Si,

Pi Pt,

QTY QTY } PRIMARY KEY{ Si, Pi } FOREIGN KEY{ Si } REFERENCES S FOREIGN KEY{ Pi } REFERENCES P ;

Пояснения

1. Эти три базовые переменные-отношения относятся к следующим типам (отношений).

RELATION { Si Si, SNAME NAME, STATUS INTEGER, CITY CHAR } RELATION { Pi Pi, PNAME NAME, COLOR COLOR, WEIGHT WEIGHT,

CITY CHAR } RELATION { Si Si, Pi Pi, QTY QTY }

Очевидно, что все эти типы (отношений) действительно являются типами и могут ис- пользоваться любым обычным способом; в частности, как тип атрибута некоторого отношения. (Фактически тип RELATION является генератором типов, позволяющим определять сколько угодно различных типов отношений, подобно тому как тип array является генератором типов массивов в общепринятых языках программирования.)

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

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

  3. При определении новой базовой переменной-отношения система делает в каталоге запись — описание этой переменной-отношения.

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

PRIMARY KEY {<стсок имен атрибутов>]

Определение внешних ключей также приводится в главе 8.

6. Наконец, любую существующую базовую переменную-отношение можно удалить. DROP VAR <иш переменной-отношения>;

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

Замечание, Для простоты предполагается, что выполнение оператора DROP приведет к ошибке, если удаляемая переменная-отношение где-либо используется, например если на нее имеется ссылка в определении какого-либо представления. Представления будут рас- смотрены в главе 9.

Обновление переменных-отношений

Присвоение значений переменным-отношениям, т.е. их обновление, в реляционной модели осуществляется с помощью оператора реляционного присвоения. На языке Tu- torial D это делается следующим образом.

<имя переменной-отношения> := реляционное выражение>;

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

Предположим, к примеру, что задана некоторая переменная-отношение R, принадле- жащая тому же типу, что и переменная-отношение поставщиков S.

VAR R BASE RELATION

{ Sf SI, SNAME NAME, STATUS INTEGER, CITY CHAR }

Ниже приведено несколько примеров правильного реляционного присвоения.

  • R := S;

  • R := S WHERE CITY = 'London' ;

  • R := S MINUS { S WHERE CITY = 'Paris' ) ;

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

Предположим теперь, что во втором и третьем примерах переменную-отношение R заменили переменной-отношением S.

  • S := S WHERE CITY = 'London' ;

  • S := S MINUS ( S WHERE CITY = 'Paris' ) ;

В этом случае оба присвоения обновляют значение переменной-отношения S: первое удаляет всех поставщиков, находящихся вне Лондона, а второе удаляет всех поставщи- ков, находящихся в Париже. Для удобства язык Tutorial D поддерживает явные операто- ры INSERT, DELETE и UPDATE, однако каждый из них является лишь сокращенным обозна- чением некоторой операции реляционного присвоения. Например, рассмотрим следую- щий оператор11.

■ INSERT INTO S

RELATION { TUPLE { Si Si ( 'S6' ),

SNAME NAME ( 'Smith' ),

STATUS 50,

CITY 'Rome' } } ;

Он является эквивалентом операции присвоения, которая записывается так.

S := S UNION

RELATION { TUPLE { Si Si ( 'S6' ),

SNAME NAME ( 'Smith' ),

STATUS 50,

CITY 'Rome' } } ;

" Выражение RELATION (...) в примере оператора INSERT является обращением к опера- тору выбора (в свою очередь, выражение в фигурных скобках в фразе TUPLE {...} является об- ращением к оператору выбора кортежа, а выражения во внутренних скобках — обращением к оператору выбора скаляров). Подробнее об этом рассказывается в разделах б.3 и 6.4 главы б.

Обратите внимание, что эта операция присвоения будет успешной лишь в том случае, если в переменной-отношении S уже содержится кортеж с данными о поставщике с но- мером 'S6'. На практике аналог оператора INSERT, записанный в виде оператора при-

своения, можно было бы расширить так, чтобы подобные ситуации проверялись. Для простоты эти усовершенствования здесь игнорируются. Разумеется, то же самое касается операторов DELETE и UPDATE.

■ DELETE S WHERE CITY = 'Paris'; эквивалентно присвоению

S := S MINUS (S WHERE CITY = 'Paris' ) ;

■ UPDATE S WHERE CITY = 'Paris'

STATUS := 2 * STATUS, CITY := 'Rome' ;

Эквивалент этого оператора, записанный в виде реляционного присвоения, имеет слишком сложный на текущий момент вид, поэтому мы его опускаем (см. [3.3]).

Подводя итог, приведем несколько упрощенный синтаксис операторов INSERT, DELETE и UPDATE.

  • INSERT INTO <ит переменной-отношения> реляционное выражениё> ;

  • DELETE <имя переменной-отношения> [ WHERE Логическое выражение> ] ;

  • UPDATE <имя переменной-отношения > [ WHERE логическое выражениё> }

<список обновляемых атрибутов> ;

Здесь параметр обновляемый атрибут> имеет следующий вид. <имя атри6ута> := <выражение>

Синтаксис выражения, помещаемого в параметр <логическое выражениё>, говорит сам за себя, тем не менее он подробно описывается в главе 6.

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

  1. В действительности имеется в виду множество кортежей, однако в данном случае кардинальность этого множества равна единице.

  2. Иногда обновление множества кортежей с кардинальностью, равной единице, не- возможно!

Предположим, например, что на переменную-отношение поставщиков наложено ог- раничение целостности (подробности приводятся в главе 8), которое заключается в том, что поставщики с номерами 'S1' и 'S4' должны иметь один и тот же статус. Тогда при обновлении отдельного кортежа, затрагивающем статус одного из двух перечисленных выше поставщиков, возникнет ошибка. В этом случае необходимо обновлять статус обо- их поставщиков одновременно, например так.

UPDATE S WHERE S# = S# { 'SI' ) OR Sf = S# ( 'S4' ) STATUS := <некоторое значение> ;

Следует подчеркнуть, что говорить об "обновлении кортежа" (или множества корте- жей), как мы это только что делали, — довольно некорректно. Кортежи, как и отноше- ния, являются значениями и не могут быть обновлены (по определению никакое значе- ние изменить нельзя). Таким образом, для того чтобы "обновлять кортежи", необходимо ввести понятие переменной кортежа, что вовсе не является частью реляционной модели! Поэтому, когда мы, например, говорим "обновление кортежа t\ с его преобразованием в кортеж t{\ подразумевается, что кортеж t\ (т.е. значение кортежа t\) заменяется корте- жем 1г (под которым снова понимается значение кортежа). Аналогичные замечания отно- сятся к фразам наподобие "обновление атрибута А" (некоторого кортежа). В этой книге мы и далее будем говорить "обновление кортежей" или "обновление атрибутов корте- жей", поскольку на практике это удобно. Однако не следует забывать, что такие сокра- щения в общем случае некорректны.

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