Изменения

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

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

5757 байт добавлено, 20:55, 14 декабря 2021
Деления
{{Определение
|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> — выражение деления через простейшие операции реляционной алгебры
==Большое деление==
{{Определение|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>C</tex> с заголовком <tex>X \cup Z</tex>, такое что для каждого <tex>z \in Z</tex> верно <tex>\pi_x(\sigma_{Z=z}(C)) = A \div \pi_Y(\sigma_{Z=z}(B))</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>LastName = Иванов</tex>. Отфильтровав по этому условию отношение <tex>B</tex>, получим <tex>Id = \{1, 2\}</tex>. Поделив отношение <tex>A</tex> на это, получим <tex>FirstName = \{Иван, Пётр\}</tex>. Поэтому в ответе есть ''Иван Иванов'' и ''Пётр Иванов''. Зафиксируем <tex>LastName = Петров</tex>. Отфильтровав по этому условию отношение <tex>B</tex>, получим <tex>Id = \{1\}</tex>. Поделив отношение <tex>A</tex> на это, получим <tex>FirstName = \{Иван, Пётр, Сидор\}</tex>. Поэтому в ответе есть ''Иван Петров'', ''Пётр Петров'' и ''Сидор Петров''. Зафиксируем <tex>LastName = Сидоров</tex>. Отфильтровав по этому условию отношение <tex>B</tex>, получим <tex>Id = \{3\}</tex>. Поделив отношение <tex>A</tex> на это, получим <tex>FirstName = \{Пётр, Сидор\}</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>A ⋇ B = \pi_X(A) \times \pi_Z(B) \setminus \pi_{XZ}(\pi_X(A) \times B \setminus A \Join B)</tex> — выражение большого деления через простейшие операции реляционной алгебры
=Литература=
9
правок

Навигация