Главная » SQL, Базы данных » ОПЕРАЦИИ СРАВНЕНИЯ

0

Предположим, что рассматриваются два обычных примера переменных Е и с с объявленными типами, соответственно, ELLIPSE и CIRCLE, и переменной Е  присваивается текущее значение переменной С следующим образом.

Е    :=   С    ;

В     таком случае, безусловно, очевидно, что теперь при выполнении показанной ниже операции сравнения на равенство должен быть получен результат TRUE, И ЭТО действительно так и происходит.

Е   =   С

Общее правило состоит в следующем. Допустим, что х и Y — произвольные выражения. В таком случае операция сравнения х = Y является допустимой, если объявленные типы DT (X) и DT (Y) имеют общий супертип (это требование, безусловно удовлетворяется, если один из этих типов является супертипом  другого). В противном случае такое сравнение  является  недопустимым  (соответствующая  проверка  проводится  на  этапе компиляции). А если эта  операция сравнения является допустимой, она возвращает TRUE, если  значение  v(x) равно значению v(Y), и FALSE — в ином случае. Кстати, следует отметить, что X и Y вряд ли могут "рассматриваться как равные", если их наиболее  конкретные типы являются разными, поскольку если v(X) равно v(Y), то  MST(X) должно быть равно MST (Y).

Применение операций сравнения в реляционной алгебре

Как было описано в главе 7, операции сравнения на равенство предусмотрены9  явно или неявно во многих операциях реляционной алгебры. А если речь о супертипах и подтипах, то оказывается, что некоторые из этих операций обнаруживают такое поведение, которое может (по крайней мере, на первый  взгляд) показаться не совсем понятным. Рассмотрим отношения RX и RY, показанные на рис. 20.2. Отметим, что единственный атрибут А в отношении RX принадлежит к объявленному типу ELLIPSE, а его аналог А в отношении RY принадлежит к объявленному типу CIRCLE. Примем такое соглашение, что значения в форме Ei на данном рисунке представляют собой эллипсы, которые не являются окружностями, а значения в форме Ci — это окружности. Наиболее конкретные типы обозначены строчными буквами.

Теперь рассмотрим соединение отношений RX и RY, скажем, RJ (рис. 20.3). Очевидно, что каждое значение А в соединении RJ ДОЛЖНО обязательно  принадлежать к типу CIRCLE (поскольку любое значение А в отношении RX, наиболее конкретным типом которого является просто ELLIPSE, не может "рассматриваться как равное" любому значению А в RY). Поэтому можно считать, что объявленным типом атрибута А в соединении RJ

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

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

Рис. 20.2. Отношения RX и RY

Рис. 20.3. Соединение RJ отношений RX и RY

Поскольку каждое из отношений, RX и RY, включает А в качестве своего единственного атрибута, то выражение RX JOIN RY сводится к RX INTERSECT RY. Поэтому в данном случае правило, касающееся объявленного типа атрибута результата для операции соединения JOIN, должно, очевидно, сводиться к аналогичному правилу ДЛЯ INTERSECT.

В свою очередь, выражение RX INTERSECT RY логически эквивалентно выражению RX MINUS (RX MINUS RY). Допустим, что при этом результатом выполнения выражения,  которое  является  вторым  операндом  (речь  идет  о  выражении  RX MINUS RY), является отношение RZ. Тогда должно быть очевидно следующее:

а)  в общем отношение RZ должно включать некоторые значения А наиболее кон кретного типа ELLIPSE и поэтому объявленным типом атрибута А в отноше нии RZ должен быть ELLIPSE;

б)  таким образом, первоначальное выражение сводится к RX MINUS RZ, где объ явленным типом атрибута А и в RX, и в RZ является ELLIPSE, И поэтому приво дит к получению окончательного результата, в котором объявленным типом атрибута А снова, безусловно, должен быть ELLIPSE.

▪    Из этого следует, что объявленным типом атрибута результата для  выражения RX INTERSECT RY, и поэтому также для выражения RX  JOIN RY, должен быть ELLIPSE, а не CIRCLE, даже несмотря на то  (еще раз напоминаем), что каждое  значение  этого  атрибута  должно   фактически  принадлежать  к  типу CIRCLE!

Теперь перейдем к описанию реляционной операции, которая обозначается оператором MINUS. Вначале рассмотрим выражение RX MINUS RY. Должно быть очевидно, что некоторые значения А в результатах этой операции должны принадлежать к типу ELLIPSE, а не CIRCLE, и поэтому объявленный тип атрибута А в этих результатах также должен представлять собой тип ELLIPSE. А что насчет выражения RY MINUS RX? Очевидно, что каждое значение А в результатах этой последней операции должен принадлежать к типу CIRCLE, и поэтому снова можно предположить, что объявленным типом атрибута А в этих результатах должен быть CIRCLE, а не ELLIPSE. Но следует отметить, что выражение RX INTERSECT RY логически эквивалентно не только выражению

RX MINUS (RX MINUS RY), как уже было отмечено выше, но также и выражению RY MINUS (RY MINUS RX), с учетом того факта, что объявление типа А в результатах выражения RY MINUS RX как CIRCLE приводит к противоречию. Из этого следует, что объявленным типом атрибута результата для выражения RY  MINUS RX также должен быть ELLIPSE, а не CIRCLE, даже несмотря на то, что каждое значение этого атрибута должно фактически принадлежать к типу CIRCLE.

Наконец, рассмотрим выражение RX UNION RY. В данном случае должно быть очевидно, что в общем результаты будут включать некоторые значения А наиболее конкретного типа ELLIPSE, и поэтому объявленным типом атрибута А в этих результатах должен обязательно быть ELLIPSE. Таким образом, объявленным типом атрибута результата для оператора UNION также должен быть ELLIPSE (НО В данном конкретном случае, в отличие от случаев с использованием операторов JOIN, INTERSECT И MINUS, такое решение уже вряд ли можно назвать противоречащим здравому смыслу).

Поэтому может быть сформулировано общее правило, приведенное ниже.

■  Допустим, что rх и rу отношения с общим атрибутом А, а объявленными типами А в отношениях rх и rу являются, соответственно, DT (АХ) И DT (Ay). Рассмотрим соединение отношений rх и rу (обязательно по атрибуту А,  применяемому, по крайней мере, как один из атрибутов соединения). Типы DT (Ах) и DT (Ay) должны иметь общий супертип т, поскольку в противном случае такое соединение будет недопустимым (проверка этого условия осуществляется на этапе компиляции). Если подобное соединение является допустимым, объявленным типом А в результате становится наиболее конкретный из всех таких общих супертипов т.

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

Проверка типа

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

IS_T  (  X  )

Это выражение принимает значение TRUE, если выражение X принадлежит к типу т, а в противном случае принимает значение FALSE. Например, если с — переменная с объявленным типом CIRCLE, то оба приведенные ниже выражения принимают значение TRUE.

IS_CIRCLE ( С

) IS_ELLIPSE (

С )

Если же Е — переменная с объявленным типом ELLIPSE, а текущим наиболее конкретным типом является некоторый подтип CIRCLE, то следующее  выражение также принимает значение TRUE.

IS_CIRCLE   (  E  )

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

R WHERE THE_R ( A ) > LENGTH (2.0)

Но обработка этого выражения окончится неудачей из-за ошибки при проверке типа на этапе компиляции, поскольку для оператора THE_R требуется фактический параметр типа  CIRCLE,  а  объявленным  типом  атрибута  А  является  ELLIPSE, а  не  CIRCLE. (Безусловно, если бы эта проверка на этапе компиляции не была выполнена, то вместо этого была бы обнаружена ошибка  при проверке типа на этапе прогона, как только встретился бы кортеж, в котором значение А было бы эллипсом, а не окружностью.) Очевидно, что для успешного решения этой задачи необходимо исключить из рассмотрения те  кортежи, в которых значение А представляет собой эллипс, еще до того, как  будет предпринята сама попытка проверить радиус. А именно, такая операция осуществляется, если используется приведенная ниже формулировка.

R : IS_CIRCLE ( А ) WHERE THE_R ( A ) > LENGTH (2.0)

Это выражение определено (выражаясь неформально) как средство получения таких кортежей, в которых значением А являются окружности с радиусом больше двух. Точнее, данное выражение возвращает отношение со следующими свойствами:

а)  оно имеет такой же заголовок, как и отношение R, за исключением того, что объ явленным типом атрибута А в этих результатах является CIRCLE, а не ELLIPSE;

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

Иными  словами,  автор  предлагает  использовать  новый  реляционный  оператор,

имеющий следующую форму.

R   :    IS_T   (   А   )

Здесь R— реляционное выражение, а А— атрибут соответствующего  отношения (скажем, r), обозначенного этим выражением. Значение всего данного выражения определено как отношение, обладающее следующими свойствами:

а)  оно имеет такой же заголовок, как и отношение r, за исключением того, что объ явленным типом атрибута А в этих результатах является т;

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

Примечание. В [3.3] определены обобщенные формы обоих операторов, введенных в данном подразделе, например, обобщенная форма оператора IS_T, который проверяет, принадлежит ли один операнд к такому же типу, как и другой, а не просто проверяет, принадлежит ли он к некоторому явно указанному типу.

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

По теме:

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