|
| ||||||||||||
| ||||||||||||
|
Обращение с операциями как с отношениями Обратимся снова к отношению 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. В конце раздела Д&Д отмечают, что не только со скалярными функциями можно обращаться как с отношениями. Вот примеры:
Рассмотрим эти примеры немного глубже. Очевидно, что SORT можно воспринимать как отношение с атрибутами, например, X и Y типа RATIONAL. Но это отношение не является функцией, поскольку отсутствует функциональная зависимость YаX (например, одновременно присутствуют кортежи (4.0, +2.0) и (4.0, -2.0)). (С другой стороны, функциональная зависимость XаY поддерживается.) Это отношение содержит:
Из этого следует, что выражение SQRT >COMPOSE< { { < X, RATIONAL, 4.0 > } } по сути дела представляет вызов операции SQRT, но при вызове образуются два результата. Более точно, производится унарное отношение со следующим телом: { { < 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, не обязательно гарантирующей появление ровно одного дополнительного атрибута. Назад | Содержание | Вперед
|
|
CITForum © 1997–2025