Обращение с операциями как с отношениями
Обратимся снова к отношению 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, не обязательно гарантирующей появление ровно одного дополнительного атрибута.
Назад |
Содержание |
Вперед