Третий манифест Кристофера Дейта и Хью Дарвена

       

Обращение с операциями как с отношениями


Обращение с операциями как с отношениями

Обратимся снова к отношению PLUS с целочисленными атрибутами X, Y и Z, соответствующему предикату "X + Y = Z". Пусть TWO_AND_TWO - это (уникальное) отношение, тело которого состоит из единственного кортежа

{ < X, INTEGER, 2 >, <Y, INTEGER, 2> }

Тогда выражение

TWO_AND_TWO >COMPOSE< PLUS

произведет отношение, тело которого состоит из единственного кортежа

{ < Z, INTEGER, 4> }

Тем самым, на самом деле была вызвана операция "+" с аргументами X = 2 и Y = 2, и был получен результат Z = 4 (заметим, что у результата имеется имя Z; Д&Д изучают возможные последствия этого для языка D). Конечно, этот результат является встроенным как значение атрибута внутри кортежа отношения. Чтобы извлечь результат в виде чистого скалярного значения, необходимо выйти за пределы алгебры A и применить операции (требуемые RM-утверждениями 7 и 6 соответственно) для (a) извлечения указанного кортежа из указанного отношения и (b) для извлечения значения указанного атрибута из указанного кортежа. В терминах языка TUTORIAL D эти извлечения можно выполнить следующим образом:

Z FROM ( TUPLE FROM ( result ) )

где result обозначает результат вычисления A-выражения TWO_AND_TWO >COMPOSE< PLUS.

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

Рассмотрим выражение TWO_AND_TWO >AND< PLUS.

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



{ < X, INTEGER, 2 >, < Y, INTEGER, 2 >, < Z, INTEGER, 2 > }

Следует отчетливо понимать, что это выражение A логически эквивалентно следующему расширению на языке TUTORIAL D:

EXTEND TWO_AND_TWO ADD X + Y AS Z

Этого примера достаточно, чтобы показать, каким образом можно отказаться от операции EXTEND.
Более того, то же самое выражение логически эквивалентно следующем ограничению на языке TUTORIAL D:

PLUS WHERE X = 2 AND Y = 2

Этого примера достаточно, чтобы показать, каким образом можно отказаться от restrict.

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

В конце раздела Д&Д отмечают, что не только со скалярными функциями можно обращаться как с отношениями. Вот примеры:

  • Пример скалярной операции, не являющейся функцией, представляет SQRT ("квадратный корень"). Для заданного положительного аргумента эта операция вырабатывает два различных значения. Например, SQRT(4.0) возвращает +2.0 и -2.0.
  • Пример операции, являющейся функцией, но не скалярной, представляет ADDR_OF ("адрес"). Эта операция для заданного служащего возвращает адрес этого служащего в виде коллекции из четырех значений (STREET, CITY, STATE, ZIP).

    Рассмотрим эти примеры немного глубже. Очевидно, что SORT можно воспринимать как отношение с атрибутами, например, X и Y типа RATIONAL. Но это отношение не является функцией, поскольку отсутствует функциональная зависимость YаX (например, одновременно присутствуют кортежи (4.0, +2.0) и (4.0, -2.0)). (С другой стороны, функциональная зависимость XаY поддерживается.) Это отношение содержит:

  • Для x = 0 ровно один кортеж с X = x;
  • Для x > 0 ровно два кортежа с X = x;
  • Для x < 0 ни одного кортежа с X = x.

    Из этого следует, что выражение

    SQRT >COMPOSE< { { < X, RATIONAL, 4.0 > } }

    по сути дела представляет вызов операции SQRT, но при вызове образуются два результата. Более точно, производится унарное отношение со следующим телом:

    { { < Y, RATIONAL, +2.0 > },

         < Y, RATIONAL, -2.0 > } }

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

    Очевидно, что можно обращаться как с отношением и с операцией ADDR_OF. Это отношение имело бы атрибуты E, STREET, CITY, STATE и ZIP, а атрибут E был бы возможным ключом. Поэтому выражение

    { { < E, EMPLOYEE, e > } } >COMPOSE< ADDR_OF

    (e обозначает некоторого служащего) на самом деле представляет вызов операции ADDR_OF, возвращающий не скалярное значение. Одним из выводов Д&Д является то, что в языке D может оказаться разумным поддерживать расширенную форму EXTEND, не обязательно гарантирующей появление ровно одного дополнительного атрибута.



    Содержание раздела