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



         

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


Более того, то же самое выражение логически эквивалентно следующем ограничению на языке 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, не обязательно гарантирующей появление ровно одного дополнительного атрибута.




    Содержание  Назад  Вперед