3. Свойства бинарных операций
Из приведенных выше определений бинарных операций объединения, пересечения, разности, декартового произведения и естественного соединения следуют свойства.
1. Первое свойство, как и в случае унарных операций, иллюстрирует соотношение мощностей отношений:
1) для операции объединения:
|r1 ∪ r2| ≤ |r1| + |r2|;
2) для операции пересечения:
|r1 ∩ r2 | ≤ min(|r1|, |r2|);
3) для операции разности:
|r1 \ r2| ≤ |r1|;
4) для операции декартового произведения:
|r1 × r2| = |r1| · |r2|;
5) для операции естественного соединения:
|r1 × r2| ≤ |r1| · |r2|.
Соотношение мощностей, как мы помним, характеризует, как меняется количество кортежей в отношениях после применения той или иной операции. Итак, что мы видим? Мощность объединения двух отношений r1 и r2 меньше суммы мощностей исходных отношений-операндов. Почему это происходит? Все дело в том, что при объединении совпадающие кортежи исчезают, накладываясь друг на друга. Так, обратившись к примеру, который мы рассматривали по прохождении этой операции, можно заметить, что в первом отношении было два кортежа, во втором – три, а в результирующем – четыре, т. е. меньше, чем пять (сумма мощностей отношений-операндов). По совпадающему кортежу {b, 2} эти отношения «склеились».
Мощность результата пересечения двух отношений меньше или равна минимальной мощности исходных отношений-операндов. Обратимся к определению этой операции: в результирующее отношение попадают только те кортежи, которые присутствуют в обоих отношениях исходных. А значит, мощность нового отношения никак не может превышать мощности того отношения-операнда, число кортежей которого наименьшее из двух. А равной этой минимальной мощности мощность результата быть может, так как всегда допускается случай, когда все кортежи отношения с меньшей мощностью совпадают с какими-то кортежами второго отношения-операнда.
В случае операции разности все достаточно тривиально. Действительно, если из первого отношения-операнда «вычесть» все кортежи, присутствующие также во втором отношении, то их количество (а следовательно, мощность) уменьшится. В том случае, если ни один кортеж первого отношения не совпадет ни с одним кортежем отношения второго, т. е. «вычитать» будет нечего, мощность его не уменьшится.
Интересно, что в случае применения операции декартового произведения мощность результирующего отношения в точности равна произведению мощностей двух отношений-операндов. Понятно, что это происходит потому, что в результат записываются все возможные пары кортежей исходных отношений, а ничего не исключается.
И, наконец, операцией естественного соединения получается отношение, мощность которого больше или равна произведения мощностей двух исходных отношений. Опять-таки это происходит потому, что отношения-операнды «склеиваются» по совпадающим кортежам, а несовпадающие – из результата исключаются вовсе.
2. Свойство идемпотентности:
1) для операции объединения: r ∪ r = r;
2) для операции пересечения: r ∩ r = r;
3) для операции разности: r \ r ≠ r;
4) для операции декартового произведения (в общем случае, свойство не применимо);
5) для операции естественного соединения: r × r = r.
Интересно, что свойство идемпотентности верно не для всех операций из приведенных, а для операции декартового произведения оно и вовсе не применимо. Действительно, если объединить, пересечь или естественно соединить какое-либо отношение само с собой, оно не изменится. А вот если отнять от отношения точно равное ему отношение, в результате получится пустое отношение.
3. Свойство коммутативности:
1) для операции объединения:
r1 ∪ r2 = r2 ∪ r1;
2) для операции пересечения:
r ∩ r = r ∩ r;
3) для операции разности:
r1 \ r2 ≠ r2 \ r1;
4) для операции декартового произведения:
r1 × r2 = r2 × r1;
5) для операции естественного соединения:
r1 × r2 = r2 × r1.
Свойство коммутативности выполняется для всех операций, кроме операции разности. Это легко понять, ведь от перестановки отношений местами их состав (кортежи) не меняется. А при применении операции разности важно, какое из отношений-операндов стоит на первом месте, потому что от этого зависит, кортежи какого отношения примутся за эталонные, т. е. с какими кортежами будут сравниваться другие кортежи на предмет исключения.
4. Свойство ассоциативности:
1) для операции объединения:
(r1 ∪ r2) ∪ r3 = r1 ∪(r2 ∪ r3);
2) для операции пересечения:
(r1 ∩ r2) ∩ r3 = r1 ∩ (r2 ∩ r3);
3) для операции разности:
(r1 \ r2) \ r3 ≠ r1 \ (r2 \ r3);
4) для операции декартового произведения:
(r1 × r2) × r3 = r1 × (r2 × r3);
5) для операции естественного соединения:
(r1 × r2) × r3 = r1 × (r2 × r3).
И снова мы видим, что свойство выполняется для всех операций, кроме операции разности. Объясняется это таким же образом, как и в случае применения свойства коммутативности. По большому счету, операциям объединения, пересечения, разности и естественного соединения все равно в каком порядке стоят отношения-операнды. Но при «отнимании» отношений друг от друга порядок играет главенствующую роль.
На основании вышеприведенных свойств и рассуждений можно сделать следующий вывод: три последних свойства, а именно свойство идемпотентности, коммутативности и ассоциативности, верны для всех рассмотренных нами операций, кроме операции разности двух отношений, для которой не выполнилось вообще ни одно из трех означенных свойств, и только в одном случае свойство оказалось неприменимым.
4. Варианты операций соединения
Используя как основу рассмотренные ранее унарные операции выборки, проекции, переименования и бинарные операции объединения, пересечения, разности, декартова произведения и естественного соединения (все они в общем случае называются операциями соединения), мы можем ввести новые операции, выведенные с помощью перечисленных понятий и определений. Подобная деятельность называется составлением вариантов операций соединения.
Первым таким вариантом операций соединения является операция внутреннего соединения по заданному условию соединения.
Операция внутреннего соединения по какому-то определенному условию определяется как производная операция от операций декартового произведения и выборки.
Запишем формульное определение этой операции:
r1(S1) × P r2(S2) = σ <P> (r1 × r2), S1 ∩ S2 = ∅;
Здесь P = P <S1 ∪ S2> – условие, накладываемое на объединение двух схем исходных отношений-операндов. Именно по этому условию и происходит отбор кортежей из отношений r1 и r2 в результирующее отношение.
Следует отметить, что операция внутреннего соединения может применяться к отношениям с разными схемами отношений. Эти схемы могут быть любыми, но они ни в коем случае не должны пересекаться.
Кортежи исходных отношений-операндов, попавшие в результат операции внутреннего соединения, называются соединимыми кортежами.
Для наглядного иллюстрирования работы операции внутреннего соединения, приведем следующий пример.
Пусть нам даны два отношения r1(S1) и r2(S2) с различными схемами отношения:
r1(S1):
Итак, мы видим, что действительно «слипание» двух таблиц, представляющих отношения, произошло именно по тем кортежам, в которых выполняется условие операции внутреннего соединения P = (b1 = b2).
Теперь на основании уже введенной операции внутреннего соединения мы можем ввести операцию левого внешнего соединения и правого внешнего соединения. Поясним.
Результатом операции левое внешнее соединение является результат внутреннего соединения, пополненный несоединимыми кортежами левого исходного отношения-операнда. Аналогично результат операции правого внешнего соединения определяется как результат операции внутреннего соединения, пополненный несоединимыми кортежами стоящего справа исходного отношения-операнда.
Вопрос, чем же пополняются результирующие отношения операций левого и правого внешнего соединения, вполне ожидаем. Кортежи одного отношения-операнда дополняются на схеме другого отношения-операнда Null-значениями.
Стоит заметить, что введенные таким образом операции левого и правого внешнего соединения являются производными операциями от операции внутреннего соединения.
Чтобы записать общие формулы для операций левого и правого внешнего соединений, проведем некоторые дополнительные построения.
Пусть нам даны два отношения r1(S1) и r2(S2) с различными схемами отношений S1 и S2, не пересекающимися друг с другом.
Так как мы уже оговаривали, что операции левого и правого внутреннего соединения являются производными, то мы можем получить следующие вспомогательные формулы для определения операции левого внешнего соединения:
1) r3 (S2 ∪ S1) ≔ r1(S1) × Pr2(S2);
r 3 (S2 ∪ S1) — это просто результат внутреннего соединения отношений r1(S1) и r2(S2). Левое внешнее соединение является производной операцией именно от операции внутреннего соединения, поэтому мы и начинаем наши построения с нее;
2) r4(S1) ≔ r 3(S2 ∪S1) [S1];
Таким образом, с помощью унарной операции проекции, мы выделили все соединимые кортежи левого исходного отношения-операнда r1(S1). Результат обозначили r4(S1) для удобства применения;
3) r5 (S1) ≔ r1(S1) \ r4(S1);
Здесь r1(S1) — все кортежи левого исходного отношения-операнда, а r4(S1) – его же кортежи, только соединимые. Таким образом, при помощи бинарной операции разности, в отношении r5(S1) у нас получились все несоединимые кортежи левого отношения-операнда;
4) r6(S2)≔ {∅(S2)};
{∅(S2)} — это новое отношение со схемой (S2), содержащее всего один кортеж, причем составленный из Null-значений. Для удобства мы обозначили это отношение r6(S2);
5) r7 (S2 ∪ S1) ≔ r5(S1) × r6(S2);
Здесь мы взяли полученные в пункте три, несоединимые кортежи левого отношения-операнда (r5(S1)) и дополнили их на схеме второго отношения-операнда S2 Null-значениями, т. е. декартово умножили отношение, состоящее из этих самых несоединимых кортежей на отношение r6(S2), определенное в пункте четыре;
6) r1(S1) →× P r2(S2) ≔ (r1 × P r2) ∪ r7 (S2 ∪ S1);
Это и есть левое внешнее соединение, полученное, как можно видеть, объединением декартового произведения исходных отношений-операндов r1 и r2 и отношения r7 (S2 ∪ S1), определенного в пункте пятом.
Теперь у нас имеются все необходимые выкладки для определения не только операции левого внешнего соединения, но по аналогии и для определения операции правого внешнего соединения. Итак:
1) операция левого внешнего соединения в строгом формулярном виде выглядит следующим образом:
r1(S1) →× P r2(S2) ≔ (r1 × P r2) ∪ [(r1 \ (r1 × P r2) [S1]) × {∅(S2)}];