|
Программирование >> Хронологические базы данных
Параметр <тип отношение имеет следующий вид. RELATION { <список атрибутов> } Здесь каждое значение <атрибут> в параметре <список атрибутов>, в свою очередь, является упорядоченной парой следующего вида. <имя атрибута> <имя типа> Смысл выражения <перечень определений потенциальных ключей> и необязательного выражения <перечень определений внешних ключей> раскрывается ниже. Замечание. Термин <список ...> (список, разделенный запятыми) был определен в главе 4 (раздел 4.6), а термин <перечень ...> имеет следующее определение. Если <xyz> - это некоторая синтаксическая категория (т.е. что-либо, что записывается слева в BNF-нотации), то <перечень xyz> обозначает последовательность категорий <xyz>, количество которых больше нуля либо равно нулю, причем каждая соседняя пара этих определений разделяется по крайней мере одним пробелом. В качестве примера рассмотрим несколько определений базовых отношений для базы данных поставщиков и деталей. VAR S BASE RELATION { St St, SNAME NAME, STATUS INTEGER, CITY CHAR } PRIMARY KEY { St } ; VAR P BASE RELATION { Pt Pt, PNAME NAME, COLOR COLOR, WEIGHT WEIGHT, CITY CHAR } PRIMARY KEY { Pt } ; VAR SP BASE RELATION { St St, Pt Pt, QTY QTY } PRIMARY KEY{ St, Pt } FOREIGN KEY{ St } REFERENCES S FOREIGN KEY{ P } REFERENCES P ; Пояснения 1. Эти три базовые переменные-отношения относятся к следующим типам (отношений). RELATION { St St, SNAME NAME, STATUS INTEGER, CITY CHAR } RELATION { Pt Pt, PNAME NAME, COLOR COLOR, WEIGHT WEIGHT, CITY CHAR } RELATION { St S#, Pt P#, QTY QTY } Очевидно, что все эти типы (отношений) действительно являются типами и могут использоваться любым обычным способом; в частности, как тип атрибута некоторого отношения. (Фактически тип RELATION является генератором типов, позволяющим определять сколько угодно различных типов отношений, подобно тому как тип array является генератором типов массивов в общепринятых языках программирования.) 2. Все возможные значения переменной-отношения принадлежат одному типу (а именно, тому типу, который прямо или косвенно был задан при определении этой переменной-отношения) и, следовательно, имеют одинаковые заголовки. В частности, начальным значением любой переменной-отношения является пустое отношение соответствующего типа. 3. Термины заголовок, тело, атрибут, кортеж, кардинальность и степень, уже определенные для значений отношений, очевидным образом переносятся на переменные-отношения (на все переменные-отношения, а не только на базовые переменные-отношения). 4. При определении новой базовой переменной-отношения система делает в каталоге запись - описание этой переменной-отношения. 5. Определение потенциальных ключей будет дано в главе 8. До этого времени мы просто будем считать, что в каждом определении базовой переменной-отношения есть ровно одно такое определение, записанное в следующем виде. PRIMARY KEY {<список имен атрибутов>} Определение внешних ключей также приводится в главе 8. 6. Наконец, любую существующую базовую переменную-отношение можно удалить. DROP VAR <имя переменной-отношениа>) В результате выполнения этой операции сначала значение базовой переменной-отношения устанавливается равным пустому отношению (т.е. из базовой переменной-отношения удаляются все кортежи), а затем из каталога удаляются записи, соответствующие этой переменной-отношению. По завершении указанных действий данная базовая переменная-отношение перестает быть известной системе. Замечание. Для простоты предполагается, что выполнение оператора DROP приведет к ошибке, если удаляемая переменная-отношение где-либо используется, например если на нее имеется ссылка в определении какого-либо представления. Представления будут рассмотрены в главе 9. Обновление переменных-отношений Присвоение значений переменным-отношениям, т.е. их обновление, в реляционной модели осуществляется с помощью оператора реляционного присвоения. На языке Tutorial D это делается следующим образом. <имя переменной-отношении := <реляционное выражение>; После вычисления реляционного выражения, заданного параметром <реляционное выражение>, полученное значение присваивается переменной-отношению с именем, которое указано параметром <имя переменной-отношении, заменяя ее прежнее значение. Разумеется, переменная-отношение и полученное в результате вычислений отношение должны быть одного типа, т.е. иметь одинаковые заголовки. Предположим, к примеру, что задана некоторая переменная-отношение R, принадлежащая тому же типу, что и переменная-отношение поставщиков S. VAR R BASE RELATION { S# 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, однако каждый из них является лишь сокращенным обозначением некоторой операции реляционного присвоения. Например, рассмотрим следующий оператор. INSERT INTO S RELATION { TUPLE { Si SI ( S6 ), SNAME NAME ( Smith ), STATUS 50, CITY Rome } } ; Oh является эквивалентом операции присвоения, которая записывается так. S := S UNION RELATION { TUPLE { S S ( S6 ), SNAME NAME ( Smith ), STATUS 50, CITY Rome } } ; Обратите внимание, что эта операция присвоения будет успешной лишь в том случае, если в переменной-отношении S уже содержится кортеж с данными о поставщике с номером S6. На практике аналог оператора INSERT, записанный в виде оператора при- Выражение RELATION {...} в примере оператора INSERT является обращением к оператору выбора (в свою очередь, выражение в фигурных скобках в фразе TUPLE (...) является обращением к оператору выбора кортежа, а выражения во внутренних скобках - обращением к оператору выбора скаляров). Подробнее об этом рассказывается в разделах 6.3 и 6.4 главы 6.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |