Главная » SQL, Базы данных » Отношения

0

Вначале  рассмотрим  точное  определение  термина  кортеж.  Если   дана коллекция типов Ti (i = 1, 2, . . ., п), которые не обязательно  все  должны быть разными, то значением кортежа (или кратко кортежем), определенным с помощью этих типов (назовем его t), является множество упорядоченных троек  в  форме  <Ai,Ti,vi>,  где  Ai  — имя атрибута, Ti — имя типа и vi — значение типа Ti. Кроме  того, кортеж t должен соответствовать приведенным ниже требованиям.

■    Значение п имеет степень, или арность t.

■     Упорядоченная тройка <Ai, Ti, vi> является компонентом t.

■     Упорядоченная пара <Ai, Ti> представляет собой атрибут t и однозначно опреде ляется именем атрибута Ai (имена атрибутов Ai и Aj совпадают, только если i=j). Значение vi — это значение атрибута, соответствующее атрибуту1 Ai кортежа t. Тип Ti — это соответствующий тип атрибута.

■     Полное множество атрибутов составляет заголовок t.

■     Тип кортежа t определен заголовком t, а сам заголовок и этот тип кортежа имеют такие же атрибуты (и поэтому такие же имена и типы атрибутов) и такую же сте пень, как t. Ниже показано точное определение имени типа кортежа.

TUPLE   {   А1   Т1,   А2   Т2,    …,   An   Тп   }

А ниже показан пример кортежа.

В этом кортеже атрибуты имеют имена MAJOR_P#, MINOR_P# и QTY; соответствующими именами типов являются: р#, еще один экземпляр р# и QTY, а соответствующими значениями — Р# { ‘ Р2 ‘), Р# ( ‘ Р4 ‘ ) и QTY (7) (для упрощения в этой таблице указанные значения были заменены, соответственно,  сокращенными  обозначениями Р2, Р4 и 7). Приведенный выше кортеж имеет степень три, а его заголовок имеет следующий вид.

Ниже приведено определение типа этого кортежа.

TUPLE { MAJOR_P# P#, MINOR_P# P#, QTY QTY }

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

В языке Tutorial D для обозначения рассматриваемого кортежа может использоваться следующее выражение.

TUPLE { MAJOR_P# Р#(‘Р2′), MINOR_P# Р#(‘Р4′), QTY QTY(7) }

(Это выражение может служить примером вызова селектора кортежа; см. раздел

"Генератор типа TUPLE".) В данном выражении заслуживает особого внимания то, что

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

типы атрибутов кортежа определены однозначно с использованием заданных значений атрибутов (например, атрибут MINOR_P# ОТНОСИТСЯ К типу р#, поскольку к типу Р# относится соответствующее значение атрибута).

Свойства кортежей

Для описания кортежей используется целый ряд важных свойств, которые являются непосредственным следствием определений, приведенных выше в данном разделе. Некоторые из этих свойств перечислены ниже.

■    Каждый кортеж содержит точно одно значение (соответствующего типа) для каж дого из своих атрибутов.

■    Для компонентов кортежа не предусмотрено упорядочение, допустим, слева на право. Это свойство следует из того, что понятие кортежа определено на основа нии множества компонентов, а в математике множества не характеризуются упо рядочением своих элементов.

■    Каждое подмножество кортежа представляет собой кортеж (а каждое подмножест во заголовка является заголовком). Более того, эти свойства являются истинными применительно, в частности, к пустым подмножествам! (см. следующий абзац).

Дополнительные определения. Кортеж степени один называется  одноэлементным, кортеж степени два — двухэлементным, кортеж степени три — трехэлементным (и т.д.); в общем кортеж степени п называют n-элементным2. Кортеж нулевой степени (т.е. кортеж без компонентов) называют нуль-элементным или нуль-арным. Кратко проиллюстрируем последнее определение. Ниже  приведен нуль-арный кортеж в системе обозначений языка Tutorial D.

TUPLE   {    }

Иногда  для  обозначения  кортежа  нулевой  степени  применяется  более  наглядное представление, такое как "0-элементный кортеж". Это позволяет подчеркнуть тот факт, что данный кортеж не имеет компонентов. На первый взгляд может показаться, что нульэлементные кортежи почти не имеют практического значения, но фактически оказывается, что это понятие является исключительно важным. Дополнительная информация по этой теме приведена в разделе 6.4.

Генератор типа TUPLE

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

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

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

VAR ADDR TUPLE { STREET CHAR, CITY CHAR, STATE CHAR, ZIP CHAR } ;

Вызов генератора типа TUPLE имеет следующую общую форму.

TUPLE  {  <attribute commalist>  )

Здесь каждый параметр <attribute> с обозначением атрибута состоит из имени атрибута <attribute name>, за которым следует имя типа <type  name>.  Тип кортежа вырабатывается в результате конкретного вызова генератора типа TUPLE; например, тип, только что показанный в определении переменной ADDR, безусловно, является сгенерированным типом.

Каждый тип кортежа имеет связанный с ним оператор селектора кортежа.  Ниже приведен пример вызова селектора для типа кортежа, показанного в определении переменной ADDR.

TUPLE    {    STREET    ‘ 1 6 0 0   Pennsylvania A v e . ‘ ,    CITY    ‘Washington’, STATE    ‘DC’, ZIP   ‘20500 ‘  }

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

Операции с кортежами

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

■     По сути, все операции реляционной алгебры (см. главу 7).

■     Потенциальные ключи (см. главу 9).

■     Внешние ключи (см. также главу 9).

■     Функциональные и другие зависимости (см. главы 11—13).

Кроме того, на этих операциях основаны определения многих других понятий. Ниже приведено точное определение операции проверки кортежей на равенство.

■  Операция проверки кортежа на равенство. Кортежи tl и t2 являются равными (т.е. выражение tl = t2 принимает истинное значение) тогда и только тогда, когда они имеют одинаковые атрибуты А1, А2, .. .,  An и для  всех i (i = 1, 2,

. . ., п) значение vl атрибута Ai в кортеже tl равно значению v2 атрибута  Ai в

кортеже t2.

■ Кроме того (это утверждение может показаться очевидным, но должно быть выражено явно), кортежи tl и t2 являются дубликатами по отношению друг к другу тогда и

только тогда, когда они равны в указанном выше смысле (это означает, что они

действительно ничем не отличаются друг от друга).

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

Следует также учитывать, что к кортежам не могут применяться операторы сравнения на неравенство, "<" и ">" (т.е. типы кортежа не относятся к  категории "порядковых

типов").

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

TUPLE { STREET 1600 Pennsylvania Ave.’,

CITY ‘Washington’, STATE ‘DC’, ZIP ‘20500’ }

В этом случае проекция кортежа

ADDR   {   CITY,    ZIP   }

определяет следующий кортеж.

T U P LE    {    C I TY    ‘W as h i n g t o n ‘,    Z I P    ‘2 0500 ‘                                        }

Нам необходимо также иметь возможность извлекать значение указанного атрибута из определенного кортежа. Например, если переменная ADDR  определена, как указано выше, то выражение

ZIP  FROM ADDR

позволяет получить следующее значение.

‘20500’

Ссылка на тип кортежа

Одним из важных преимуществ схемы именования типа кортежа, которая определена в начале данного раздела, является то, что она упрощает задачу выявления типа результата произвольного выражения с участием кортежа. Например, еще раз рассмотрим следующую проекцию кортежа.

ADDR   {   CITY,    ZIP   }

Как уже было сказано, это выражение позволяет получить кортеж, образующийся из текущего значения ADDR путем "выделения проекции" по атрибутам STREET и STATE, a тип кортежа для этого производного кортежа имеет следующее точное определение.

TUPLE { CITY CHAR, ZIP CHAR }

Аналогичные замечания относятся ко всем возможным выражениям с кортежами.

Операции WRAP и UNWRAP

Рассмотрим следующие типы кортежей.

TUPLE { NAME NAME, ADDR TUPLE { STREET CHAR, CITY CHAR, STATE CHAR, ZIP CHAR } }

TUPLE { NAME NAME, STREET CHAR, CITY CHAR, STATE CHAR, ZIP CHAR }

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

■  Выражение

NADDR2 WRAP { STREET, CITY, STATE, ZIP } AS ADDR

принимает  текущее  значение  переменной  NADDR2  и  сворачивает  компоненты STREET, CITY, STATE и ZIP этого значения для получения компонента ADDR, значением которого является один кортеж. Поэтому результатом такого выражения является переменная типа ТТ1, и в связи с этим (например) следующий оператор присваивания становится допустимым.

NADDR1 := NADDR2 WRAP { STREET, CITY, STATE, ZIP } AS ADDR ;

■  Выражение

NADDRl   UNWRAP   ADDR

принимает текущее значение переменной NADDRl и разворачивает  компоненты значения переменной ADDR (значением которой является  кортеж) для получения четырех отдельных компонентов STREET, CITY, STATE и ZIP, поэтому результат данного выражения относится к типу ТТ2, и в связи с этим (например) следующий оператор присваивания становится допустимым.

NADDR2 := NADDRl UNWRAP ADDR ;

Сравнение типов кортежей и возможных представлений

Внимательный читатель мог заметить определенную аналогию между  синтаксисом генератора типа TUPLE, который описан в этом разделе, и  синтаксисом объявленного возможного представления, который рассматривается в главе 5 (в обоих синтаксических определениях используются разделенные запятыми списки элементов, а каждый элемент определяет имя некоторого объекта и имя соответствующего типа), поэтому у читателя может возникнуть вопрос о том, имеем ли мы дело с двумя понятиями или только с одним. В действительности это два отдельных понятия (и синтаксическое сходство определений не имеет значения). Например, если X относится к типу кортежа, то на практике вполне может потребоваться получить проекцию некоторого значения  этого типа, как описано в предыдущем подразделе. Но если X — возможное представление для некоторого скалярного типа т, то задача получения проекции значения этого скалярного типа т не возникает. Дополнительные сведения по этой теме приведены в [3.3].

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

По теме:

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