Главная » SQL, Базы данных » ПЕРЕМЕННЫЕ ОТНОШЕНИЯ

0

Теперь обратимся к переменным отношения (relation variable, или сокращенно relvar). Как было отмечено в главе 3, переменные отношения имеют две разновидности — базовые переменные отношения и представления (называемые также, соответственно, реальными и виртуальными переменными отношения). В данном разделе нас в основном интересует именно базовые переменные отношения (представления подробно рассматриваются в главе 10), но следует отметить, что все сказанное здесь применительно к переменным отношения без дополнительного уточнения распространяется на все переменные отношения в целом, включая представления.

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

Ниже показан синтаксис определения базовой переменной отношения.

VAR <relvar name> BASE  <relation   type>

<c andidate k ey  def  list> [    <foreign key  def list>   ] ;

Параметр с обозначением типа отношения <relation   type> принимает следующую форму.

RELATION  {  <attribute commalist>  }

Здесь параметр <attribute commalist> — разделенный запятыми список  атрибутов. Это выражение фактически представляет собой вызов генератора типа RELATION, как описано в разделе 6.3). Параметр <candidate key def  list> и необязательный параметр <foreign key def list> описаны в одном из  следующих абзацев. Ниже в качестве примера приведены определения  базовых  переменных отношения для базы данных поставщиков и деталей (которые были также показаны на рис. 3.9).

VAR S BASE RELATION

{ S# S#,

SNAME NAME, STATUS

INTEGER, CITY CHAR

} PRIMARY KEY { S#

} ;

VAR P BASE RELATION { Р# Р#, PNAME NAME,

COLOR COLOR, WEIGHT WEIGHT, CITY CHAR }

PRIMARY KEY { P#};

VAR SP BASE RELATION { S# S#, P# P#, QTY QTY }

PRIMARY KEY { S#, P# } FOREIGN KEY { S# }

REFERENCES S FOREIGN KEY { P#

} REFERENCES P ;

Пояснения

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

RELATION { S# S#, SNAME NAME, STATUS INTEGER, CITY CHAR } RELATION { P# P#, PNAME NAME, COLOR COLOR,

WEIGHT WEIGHT, CITY

CHAR } RELATION { S# S#, P# P#, QTY QTY }

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

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

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

5.     Определения потенциальных ключей подробно рассматриваются в главе 9, а на данный момент мы будем просто предполагать, что определение каждой базовой переменной отношения включает одно и только одно определение потенциаль ного ключа,<candidate key def> в следующей конкретной форме.

PRIMARY KEY   {    <attribute name commalist>   }

6.    Определения внешнего ключа также рассматриваются в главе 9.

7.    Ввод определения новой переменной отношения вынуждает систему внести в свой каталог записи с описанием этой переменной отношения.

8.    Как было отмечено в главе 3, переменные отношения, как и отношения, имеют соответствующий предикат. Таковым является предикат, общий для всех отноше ний, которые представляют собой возможные значения рассматриваемой пере менной отношения. Например, в случае переменной отношения поставщиков S предикат выглядит примерно следующим образом.

Поставщик с номером поставщика S# работает по контракту, имеет имя SNAME и статус STATUS, а также находится в городе CITY

9.    Предполагается,  что  предусмотрены  средства  определения  применяемых  по умолчанию значений для атрибутов базовых переменных отношения. Применяемым по умолчанию значением заданного  атрибута  является  такое значение, которое должно быть помещено в позицию  соответствующего атрибута, если пользователь  явно  не  предоставит  нужное  значение  при  вставке  некоторого  кортежа. Подходящая  синтаксическая  конструкция  языка  Tutorial  D  для  определения применяемых по умолчанию значений может принимать форму новой  конструкции в определении базовой переменной отношения, скажем,  DEFAULT

{  <default  spec  commalist>  },  где  каждая  спецификация  применяемого  по умолчанию  значения  <default  speo  принимает  форму  <afctribute  name>

<default> (<имя атрибута> <применяемое по умолчанию значение>). Например, в определении   переменной   отношения   поставщиков   s    может    быть   задана

конструкция DEFAULT  {  STATUS О,  CITY  ‘   ‘  }.

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

Ниже приведен синтаксис операции удаления существующей базовой переменной отношения.

DROP VAR  <relvar name>   ;

Эта операция присваивает указанной переменной отношения "пустое" значение (т.е., выражаясь неформально, удаляет все кортежи в этой переменной отношения); затем она удаляет все записи каталога для этой переменной отношения. После  этого переменная отношения становится неизвестной для системы.

Примечание. Для упрощения предполагается, что операция DROP оканчивается неудачей, если рассматриваемая переменная отношения все еще используется в другом месте,

например, если на нее имеется ссылка в каком-то определении представления, заданном где-то в базе данных.

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

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

<relation assignment>

::=  <relation assign  cormalist>

; <relation assign>

::= <relvar name>  := <relation exp>

Эта операция имеет такую семантику7: во-первых, вычисляются все реляционные выражения

<relation exp> в правых частях операций реляционного присваивания <relation   assign>,

во-вторых, выполняются операции <relation  assign> в той

7 За исключением той ситуации, которая отмечена в сноске 9 в главе 5.

последовательности,  в  которой  они  записаны.  Выполнение  отдельной   операции

<relation assign> сводится к тому, что отношение, полученное в результате  вычисления  выражения  <relation  exp>  в  правой  части,  присваивается  переменной отношения, обозначенной именем <relvar name> в левой части  (с  заменой предыдущего значения этой переменной отношения). Безусловно, само отношение и переменная отношения должны принадлежать к одному и тому же типу.

В качестве примера предположим, что даны еще две базовые переменные отношения, S’ и SP’, имеющие, соответственно, такие же типы, как и переменная  отношения поставщиков S и переменная отношения поставок SP, как показано ниже.

VAR S’ BASE RELATION

{ S# S#, SNAME NAME, STATUS INTEGER, CITY CHAR }

… ; VAR SP1 BASE RELATION

{ S# S#, P# P#, QTY QTY } … ;

Ниже приведены некоторые допустимые примеры применения операции присваивания отношения<relation   assignment>.

1.  S’ := S , SP1 := SP ;

2.  S’ := S WHERE CITY = ‘London’ ;

3.  S’ := S WHERE NOT ( CITY = ‘Paris’ ) ;

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

Теперь предположим, что во второй и в третий примеры внесены такие изменения —

в каждом случае переменная отношения S ‘ в левой части заменена переменной отноше ния S, как показано ниже.

2.                 S := S WHERE CITY = ‘London’ ;

3.                 S := S WHERE NOT ( CITY = ‘Paris’ ) ;

Обратите внимание на то, что обе эти операции присваивания фактически обновляют переменную отношения S — одна из них по сути удаляет всех  поставщиков, не находящихся в Лондоне, а другая фактически удаляет всех поставщиков, не находящихся в Париже. Для удобства в языке Tutorial D  поддерживаются явно заданные операции INSERT, DELETE и UPDATE, но каждая из этих операций определена как сокращение для некоторого присваивания отношения <relation assign>. Далее приведено несколько примеров.

1.  INSERT S RELATION { TUPLE { S# S# (‘S6′),

SNAME NAME (‘Smith’),

STATUS 50,

CITY ‘Rome’ } } ;

Эквивалентная операция присваивания представлена следующим образом.

S := S UNION RELATION { TUPLE { S# S# (‘S6′), SNAME NAME (‘Smith’), STATUS 50, CITY ‘Rome’ } }

;

Кстати, следует отметить, что эта операция присваивания завершится успешно, если указанный кортеж с данными о поставщике S6 уже существует в переменной отношения

S. На практике желательно было бы уточнить семантику операции INSERT таким

образом, чтобы она активизировала исключение, если предпринимается попытка "вставить уже существующий кортеж". Но для упрощения мы здесь это уточнение игнорируем. Аналогичные замечания относятся также к операторам DELETE И UPDATE.

2.  DELETE S WHERE CITY = ‘Paris’ ;

Эквивалентная операция присваивания представлена следующим образом.

S   :=  S  WHERE NOT  (  CITY  =   ‘Paris’   )   ;

3.  UPDATE   S   WHERE  CITY   =    ‘Paris’

{  STATUS   :=   2   *

STATUS, CITY   :=

‘Rome’    }    ;

Эквивалентная операция присваивания представлена следующим образом.

S := WITH ( S WHERE CITY = ‘Paris’ ) AS T1 ,

( EXTEND Tl ADD ( 2 * STATUS AS NEW_STATUS,

‘Rome’ AS NEW_CITY ) ) AS

T2 T2 { ALL BUT STATUS, CITY } AS T3 , ( T3

RENAME ( NEW_STATUS AS STATUS, NEW_CITY AS CITY ) ) AS

T4 : ( S MINUS Tl ) UNION T4 ;

Вполне  очевидно,  что  в  последнем  случае  эквивалентный  оператор  присваивания становится довольно сложным; фактически в нем используются некоторые средства, которые будут подробно рассматриваться только в  следующей главе. По этой причине в данном разделе не дано более подробное описание данной темы.

Для использования в дальнейшем ниже приведены немного упрощенные сведения о синтаксисе операций INSERT, DELETE И UPDATE.

INSERT     <relvar     name>     <relation     exp>; DELETE <relvar name> [ WHERE <bool exp> ] ; UPDATE   <relvar name>   [   WHERE  <bool   exp>

]

{    <attribute  update  commalist>    } ;

Параметр с определением операции обновления атрибута <attribute    update> в свою очередь принимает следующую форму.

<attribute name>  :=  <еxр>

Кроме того, логическое выражение <bоо1 ехр> в операторах DELETE и UPDATE может включать ссылки на атрибуты целевой переменной отношения,  имеющие вполне очевидную семантику.

В завершение этого подраздела следует подчеркнуть, что все операции реляционного присваивании, и следовательно, операции INSERT, DELETE и UPDATE ОТНОСЯТСЯ К уровню множества8. Например, операция UPDATE, неформально выражаясь, обновляет множество

8 Между прочим, следует отметить, что по определению формы CURRENT операторов DELETE и UPDATE в языке SQL (см. раздел 4.6) относятся к уровню кортежа (или, скорее, к уровню строки)  и поэтому их применять не рекомендуется.

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

1.  Речь фактически может идти только об обновлении множества кортежей, которое просто оказалось множеством с кардинальностью один.

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

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

UPDATE S WHERE S# = S# (‘S1′) OR Si = S# (‘S4′) { STATUS := <некоторое значение> } ;

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

Переменные отношения и их интерпретация

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

9  Безусловно, сказанное здесь отнюдь не означает, что нельзя обновлять переменные-кортежи. Но как было описано в разделе 6.2, понятие переменной-кортежа в реляционной модели не определено и  реляционные базы данных не включают такие переменные.

замкнутости мира (называемое также интерпретацией замкнутого мира) гласит,

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

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии