Изменения

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

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

2266 байт добавлено, 19:41, 4 сентября 2022
м
rollbackEdits.php mass rollback
* <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>
* <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>. Тогда '''большим делением''' (англ. ''Great division'') <tex>A</tex> на <tex>B</tex> называется максимальное по включению отношение <tex>C</tex> с заголовком <tex>X \cup Z</tex>, такое что для каждого <tex>(x, z ) \in X \times Z</tex> верно <tex>\pi_x({x\sigma_{Z=z}(C)) = A \div times \pi_Y(\sigma_{Z=z}(B))\subseteq A</tex>. Обозначение: <tex>A ⋇ B</tex>
}}
===Пример===
|Иван
|Иванов
|-
|Иван
|Петров
|-
|Пётр
|Иванов
|-
|ИванПётр
|Петров
|-
|Пётр
|ПетровСидоров
|-
|Сидор
|Петров
|-
|Пётр
|Сидоров
|-
|Сидор
|Сидоров
|}
''Объяснение:.''Чтобы найти результат большого деления, переберём всевозможные <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>LastName (x, z) = Иванов(Иван, Петров)</tex>. Отфильтровав по этому условию отношение Тогда <tex>\pi_Y(\sigma_{Z=Петров}(B)) = \{(1)\}</tex>, получим . Тогда <tex>Id \{Иван\} \times \pi_Y(\sigma_{Z=Петров}(B)) = \{(1, 2Иван)\}</tex>. Поделив отношение , что является подмножеством <tex>A</tex> на это. Значит, получим <tex>FirstName = \{(Иван, Пётр\}Петров)</tex>. Поэтому есть в ответе есть ''Иван Иванов'' и ''Пётр Иванов''результате большого деления.
Зафиксируем Возьмём <tex>LastName (x, z) = Петров(Иван, Сидоров)</tex>. Отфильтровав по этому условию отношение Тогда <tex>\pi_Y(\sigma_{Z=Сидоров}(B)) = \{(3)\}</tex>, получим . Тогда <tex>Id \{Иван\} \times \pi_Y(\sigma_{Z=Сидоров}(B)) = \{1(3, Иван)\}</tex>. Поделив отношение , что '''не''' является подмножеством <tex>A</tex> на это. Значит, получим элемента <tex>FirstName = \{(Иван, Пётр, Сидор\}Сидоров)</tex>. Поэтому нет в ответе есть ''Иван Петров'', ''Пётр Петров'' и ''Сидор Петров''результате большого деления.
Зафиксируем Аналогично перебираются 6 оставшихся элементов <tex>LastName = Сидоров</tex>. Отфильтровав по этому условию отношение <tex>B</tex>, получим <tex>Id = \{3\}</tex>. Поделив отношение <tex>A</tex> на это, получим <tex>FirstName = \{Пётр, Сидор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
правки

Навигация