Изменения

Перейти к: навигация, поиск

Реляционная алгебра: соединения, деление

8011 байт добавлено, 19:41, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{Определение
|definition=
'''Соединение''' (англ. ''Join'') — общее наименование для бинарных операторов на отношениях, позволяющих некоторым образом соединить данные из нескольких двух отношений в одно.
}}
==Полное соединение==
* <tex>R_1 \, ⟕ \, R_2 = (R_1 \Join R_2) \cup (R_1 \setminus \pi_{R_1}(R_1 \Join R_2))</tex>
** ''Замечание 1.'' <tex>R_1 \setminus \pi_{R_1}(R_1 \Join R_2)</tex> — это и есть кортежи из <tex>R_1</tex>, которым не соответствует ни один кортеж из <tex>R_2</tex>
** ''Замечание 2.'' Множество атрибутов у <tex>R_1 \Join R_2</tex> есть надмножество атрибутов у <tex>R_1 \setminus \pi_{R_1}(R_1 \Join R_2)</tex>. Подразумевается, что у <tex>R_1 \setminus \pi_{R_1}(R_1 \Join R_2)</tex> недостающие атрибуты дополняются значениями <tex>null</tex>, чтобы операция объединения была определена
* <tex>R_1 \, ⟖ \, R_2 = (R_1 \Join R_2) \cup (R_2 \setminus \pi_{R_2}(R_1 \Join R_2))</tex>
* <tex>R_1 \, ⟗ \, R_2 = (R_1 \Join R_2) \cup (R_1 \setminus \pi_{R_1}(R_1 \Join R_2)) \cup (R_2 \setminus \pi_{R_2}(R_1 \Join R_2))</tex>
* <tex>R_1 \ltimes R_2 = R_2 \rtimes R_1</tex>
Из соответствующих свойств внешних соединений следуетПодставив <tex>R_1 \ltimes R_2</tex> и <tex>R_1 \rtimes R_2</tex> в соответствующие свойства <tex>R_1 \, ⟕ \, R_2</tex> и <tex>R_1 \, ⟖ \, R_2</tex>, получим:
* <tex>R_1 \, ⟕ \, R_2 = (R_1 \Join R_2) \cup (R_1 \setminus (R_1 \ltimes R_2))</tex>
{{Определение
|definition=
'''Левым условным соединением''' (англ. ''Left conditional join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex>, у которых нет общих атрибутов, по условию <tex>\theta</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а кортежами тела являются всевозможные конкатенации кортежей тел <tex>R_1</tex> и <tex>R_2</tex>, удовлетворяющих условию <tex>\theta</tex>. Если в результате кортежу из <tex>R_1</tex> не соответствует ни одного кортежа из <tex>R_2</tex>, то в результат добавляется этот кортеж из <tex>R_1</tex>, дополненный пустыми значениями. Обозначение: <tex>R_1 \, ⟕_{\theta} \, R_2</tex>
}}
{{Определение
|definition=
'''Правым условным соединением''' (англ. ''Right conditional join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex>, у которых нет общих атрибутов, по условию <tex>\theta</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а кортежами тела являются всевозможные конкатенации кортежей тел <tex>R_1</tex> и <tex>R_2</tex>, удовлетворяющих условию <tex>\theta</tex>. Если в результате кортежу из <tex>R_2</tex> не соответствует ни одного кортежа из <tex>R_1</tex>, то в результат добавляется этот кортеж из <tex>R_2</tex>, дополненный пустыми значениями. Обозначение: <tex>R_1 \, ⟖_{\theta} \, R_2</tex>
}}
{{Определение
|definition=
'''Внешним условным соединением''' (англ. ''Outer conditional join'') двух отношений <tex>R_1</tex> и <tex>R_2</tex>, у которых нет общих атрибутов, по условию <tex>\theta</tex> называется отношение, в котором заголовок является объединением заголовков <tex>R_1</tex> и <tex>R_2</tex>, а кортежами тела являются всевозможные конкатенации кортежей тел <tex>R_1</tex> и <tex>R_2</tex>, удовлетворяющих условию <tex>\theta</tex>. Если в результате кортежу из одного отношения не соответствует ни одного кортежа из другого, то в результат добавляется этот кортеж, дополненный пустыми значениями. Обозначение: <tex>R_1 \, ⟗_{\theta} \, R_2</tex>
}}
===Пример===
|Плюшкин
|}
Тогда <tex>R_1 \, ⟕_{\text{length(FirstName)}+2<\text{length(LastName)}} \, R_2</tex> равно:
{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"
!'''Id1'''
* <tex>R_1 \times_{\theta} R_2 = \sigma_{\theta}(R_1 \times R_2)</tex>
* <tex>R_1 \, ⟕_{\theta} \, R_2 = J \cup (R_1 \setminus \pi_{R_1}(J))</tex>, где <tex>J = \sigma_{\theta}(R_1 \times R_2)</tex>* <tex>R_1 \, ⟖_{\theta} \, R_2 = J \cup (R_2 \setminus \pi_{R_2}(J))</tex>, где <tex>J = \sigma_{\theta}(R_1 \times R_2)</tex>* <tex>R_1 \, ⟗_{\theta} \, R_2 = J \cup (R_1 \setminus \pi_{R_1}(J)) \cup (R_2 \setminus \pi_{R_2}(J))</tex>, где <tex>J = \sigma_{\theta}(R_1 \times R_2)</tex>
Из свойств выше нетрудно вывести:
* <tex>R_1 \, ⟕_{\theta} \, R_2 = R_2 \, ⟖_{\theta} \, R_1</tex>* <tex>R_1 \, ⟗_{\theta} \, R_2 = (R_1 \, ⟕_{\theta} \, R_2) \cup (R_1 \, ⟖_{\theta} \, R_2)</tex>
=Деление=
==Деление==
{{Определение|definition=Пусть даны отношения <tex>A</tex> с заголовком <tex>X \cup Y</tex> и отношение <tex>B</tex> с заголовком <tex>Y</tex>. Тогда '''TODOделением'''(англ. ''Division'') <tex>A</tex> на <tex>B</tex> называется максимальное по включению отношение <tex>C</tex> с заголовком <tex>X</tex>, такое что <tex>B \times C \subseteq A</tex>. Обозначение: <tex>A \div B</tex>}}Определение деления в реляционной алгебре хорошо перекликается с определением деления с остатком в арифметике: ''«Частным от деления целого числа <tex>a</tex> на натуральное число <tex>b</tex> называется максимальное целое <tex>c</tex>, такое что <tex>bc \leq a</tex>.»'' ===Пример=== Рассмотрим следующие отношения, <tex>A</tex> и <tex>B</tex> соответственно:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''|-|1|Иван|-|2|Иван|-|1|Пётр|-|2|Пётр|-|3|Пётр|-|1|Сидор|-|3|Сидор|}{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''|-|1|-|2|}Тогда результатом деления <tex>A</tex> на <tex>B</tex> будут такие имена (FirstName), которые в отношении <tex>A</tex> ассоциированы и с <tex>Id = 1</tex>, и с <tex>Id = 2</tex>. Итого получим:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''FirstName'''|-|Иван|-|Пётр|} ===Свойства=== * <tex>A \div B = \{x \in \pi_X(A) \, | \, \forall y \in B: \,\, (x, y) \in A\}</tex> — интерпретация определения на языке кванторов* <tex>A \div B = \pi_X(A) \setminus \pi_X(\pi_X(A) \times B \setminus A)</tex> — выражение деления через простейшие операции реляционной алгебры** ''Объяснение.'' <tex>\pi_X(A) \times B \setminus A</tex> это все такие пары <tex>(x, y) \in X \times Y</tex>, что <tex>x \in \pi_X(A)</tex>, но <tex>(x, y) \notin A</tex>.** Тогда <tex>\pi_X(\pi_X(A) \times B \setminus A)</tex> — это все <tex>x \in \pi_X(A)</tex>, такие что <tex>\{x\} \times B \not\subseteq A</tex>.** Тогда <tex>\pi_X(A) \setminus \pi_X(\pi_X(A) \times B \setminus A)</tex> — это максимальное по включению <tex>C \subseteq \pi_X(A)</tex>, что <tex>C \times B \subseteq A</tex> — то есть, в точности результат деления <tex>A</tex> на <tex>B</tex> по определению
==Большое деление==
{{Определение|definition=Пусть даны отношения <tex>A</tex> с заголовком <tex>X \cup Y</tex> и отношение <tex>B</tex> с заголовком <tex>Y \cup Z \,\,\,\, (X \cap Z = \varnothing)</tex>. Тогда '''TODOбольшим делением'''(англ. ''Great division'') <tex>A</tex> на <tex>B</tex> называется максимальное по включению отношение с заголовком <tex>X \cup Z</tex>, такое что для каждого <tex>(x, z) \in X \times Z</tex> верно <tex>\{x\} \times \pi_Y(\sigma_{Z=z}(B)) \subseteq A</tex>. Обозначение: <tex>A ⋇ B</tex>}}===Пример=== Рассмотрим следующие отношения, <tex>A</tex> и <tex>B</tex> соответственно:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''FirstName'''|-|1|Иван|-|2|Иван|-|1|Пётр|-|2|Пётр|-|3|Пётр|-|1|Сидор|-|3|Сидор|}{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''Id'''!'''LastName'''|-|1|Иванов|-|2|Иванов|-|1|Петров|-|3|Сидоров|}Тогда результатом большого деления <tex>A</tex> на <tex>B</tex> будет:{| class="wikitable" style="background-color:#FFF; text-align:center; padding:1000px"!'''FirstName'''!'''LastName'''|-|Иван|Иванов|-|Иван|Петров|-|Пётр|Иванов|-|Пётр|Петров|-|Пётр|Сидоров|-|Сидор|Петров|-|Сидор|Сидоров|}''Объяснение.'' Чтобы найти результат большого деления, переберём всевозможные <tex>(x, z) \in X \times Z</tex>. В нашем случае <tex>X = \{(Иван), (Пётр), (Сидор)\}, Z = \{(Иванов), (Петров), (Сидоров)\}</tex>. Возьмём <tex>(x, z) = (Иван, Иванов)</tex>. Тогда <tex>\pi_Y(\sigma_{Z=Иванов}(B)) = \{(1), (2)\}</tex>. Тогда <tex>\{Иван\} \times \pi_Y(\sigma_{Z=Иванов}(B)) = \{(1, Иван), (2, Иван)\}</tex>, что является подмножеством <tex>A</tex>. Значит, <tex>(Иван, Иванов)</tex> есть в результате большого деления. Возьмём <tex>(x, z) = (Иван, Петров)</tex>. Тогда <tex>\pi_Y(\sigma_{Z=Петров}(B)) = \{(1)\}</tex>. Тогда <tex>\{Иван\} \times \pi_Y(\sigma_{Z=Петров}(B)) = \{(1, Иван)\}</tex>, что является подмножеством <tex>A</tex>. Значит, <tex>(Иван, Петров)</tex> есть в результате большого деления. Возьмём <tex>(x, z) = (Иван, Сидоров)</tex>. Тогда <tex>\pi_Y(\sigma_{Z=Сидоров}(B)) = \{(3)\}</tex>. Тогда <tex>\{Иван\} \times \pi_Y(\sigma_{Z=Сидоров}(B)) = \{(3, Иван)\}</tex>, что '''не''' является подмножеством <tex>A</tex>. Значит, элемента <tex>(Иван, Сидоров)</tex> нет в результате большого деления. Аналогично перебираются 6 оставшихся элементов <tex>X \times Z</tex>. ===Свойства=== * <tex>A ⋇ B = \{(x, z) \in \pi_X(A) \times \pi_Z(B) \, | \, \forall y \in \pi_Y(\sigma_{Z=z}(B)): \,\, (x, y) \in A\}</tex> — интерпретация определения на языке кванторов* Если <tex>C = A ⋇ B</tex>, то для каждого <tex>z \in Z</tex> верно <tex>\pi_X(\sigma_{Z=z}(C)) = A \div \pi_Y(\sigma_{Z=z}(B))</tex> — интерпретация большого деления как "деление для каждого <tex>z</tex>"* <tex>A ⋇ B = \pi_X(A) \times \pi_Z(B) \setminus \pi_{XZ}(\pi_X(A) \times B \setminus A \Join B)</tex> — выражение большого деления через простейшие операции реляционной алгебры
=Литература=
1632
правки

Навигация