Конспект лекции: Реляционная алгебра — выборка и проекция

ОП.08 Основы проектирования баз данных | Тема 2. Взаимосвязи в моделях и реляционный подход к построению моделей

1. Введение: что такое реляционная алгебра?

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

В 1970 году создатель реляционной модели Эдгар Франк Кодд (Edgar F. Codd) предложил строгий математический аппарат для манипулирования данными — реляционную алгебру (Relational Algebra). Это процедурный язык запросов, в котором операции применяются к отношениям и порождают новые отношения.

Определение реляционной алгебры:
Реляционная алгебра — это замкнутая система операций над отношениями. Входными операндами служат одно или несколько отношений, а результатом операции всегда является новое отношение.

Принцип реляционной замкнутости (Relational Closure)

Свойство замкнутости — краеугольный камень теории реляционных баз данных. Оно гласит:

2. Геометрическая концепция унарных операций

Две базовые операции реляционной алгебры — выборка (селекция) и проекция — являются унарными, то есть принимают на вход строго одно отношение $R$. Их исключительно легко запомнить через наглядную геометрическую аналогию:

1. Селекция ($\sigma$) — Горизонтальный срез

Вырезает из таблицы строки (кортежи), удовлетворяющие логическому предикату. Заголовок таблицы (набор столбцов) остается неизменным.

Исходная таблица: Селекция sigma[Возраст > 20]: +----+-------+-------+ +----+-------+-------+ | ID | Имя | Возр | | ID | Имя | Возр | +----+-------+-------+ +----+-------+-------+ | 1 | Анна | 19 | --> | 2 | Борис | 22 | [строка 2] | 2 | Борис | 22 | | 3 | Дарья | 21 | [строка 3] | 3 | Дарья | 21 | +----+-------+-------+ +----+-------+-------+ (Горизонтальный срез!)

2. Проекция ($\pi$) — Вертикальный срез

Вырезает из таблицы столбцы (атрибуты). Ненужные столбцы отбрасываются, а возникающие дубликаты строк автоматически устраняются.

Исходная таблица: Проекция pi[Имя]: +----+-------+-------+ +-------+ | ID | Имя | Город | | Имя | +----+-------+-------+ +-------+ | 1 | Анна | Сургут| | Анна | | 2 | Борис | Москва| --> | Борис | | 3 | Анна | Тюмень| +-------+ +----+-------+-------+ (Анна схлопнулась! (Вертикальный срез!) Дубликат удален!)

3. Операция Выборки (Селекции, $\sigma$)

Математическое обозначение: греческая буква $\sigma$ (сигма) с индексом-предикатом $\varphi$:

$\sigma_{\varphi}(R) = \{ t \in R \mid \varphi(t) = \text{True} \}$

Здесь:

Свойства выборки:

  1. Степень отношения (количество столбцов) не меняется: $\text{deg}(\sigma_\varphi(R)) = \text{deg}(R)$. Все столбцы схемы остаются на месте.
  2. Мощность отношения (количество строк) уменьшается или сохраняется: $0 \le \text{card}(\sigma_\varphi(R)) \le \text{card}(R)$.
  3. Коммутативность последовательных выборок: $\sigma_{\varphi_1}(\sigma_{\varphi_2}(R)) \equiv \sigma_{\varphi_2}(\sigma_{\varphi_1}(R)) \equiv \sigma_{\varphi_1 \land \varphi_2}(R)$.

4. Операция Проекции ($\pi$) и устранение дубликатов

Математическое обозначение: греческая буква $\pi$ (пи) с перечнем оставляемых атрибутов в подстрочном индексе:

$\pi_{A_1, A_2, \dots, A_k}(R) = \{ t[A_1, A_2, \dots, A_k] \mid t \in R \}$

Закон устранения дубликатов

Постулат теории множеств гласит: множество не может содержать одинаковых элементов. В исходном отношении $R$ уникальность каждой строки гарантировалась первичным ключом (например, ID). Но если мы проецируем таблицу на атрибуты, не включающие первичный ключ (например, только на столбец Город), в столбце неизбежно возникнут повторы.

Математическое правило Кодда:
Проекция обязана автоматически ликвидировать дубликаты строк. Если 50 сотрудников живут в городе Сургут, проекция на атрибут Город вернет строго одну строку со значением «Сургут».

Свойства проекции:

  1. Степень результата равна количеству спроецированных атрибутов: $\text{deg}(\pi_{A_1, \dots, A_k}(R)) = k$.
  2. Мощность результата не превышает мощности исходного отношения: $\text{card}(\pi_A(R)) \le \text{card}(R)$.
  3. Идемпотентность повторной проекции на то же подмножество: $\pi_A(\pi_{A \cup B}(R)) \equiv \pi_A(R)$.

5. Суперпозиция операций: $\pi(\sigma(R))$ и пошаговый пример

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

Исходное отношение «Преподаватели» ($T$):

ID ФИО Кафедра Стаж Оклад
1 Иванов А.С. Информатика 8 65000
2 Петров В.М. Высшая математика 3 48000
3 Сидорова Е.Н. Информатика 12 82000
4 Смирнов Д.К. Информатика 6 59000
5 Козлова М.А. Экономика 10 71000

Задача: Вычислить выражение $\pi_{\text{Кафедра}}(\sigma_{\text{Стаж} \ge 6 \land \text{Оклад} < 80000}(T))$

Шаг 1. Вычисляем внутреннюю операцию — селекцию $\sigma$:
Предикат: $\text{Стаж} \ge 6$ И $\text{Оклад} < 80000$. Проверяем каждый кортеж:

Промежуточное отношение $T' = \sigma(T)$:

ID ФИО Кафедра Стаж Оклад
1 Иванов А.С. Информатика 8 65000
4 Смирнов Д.К. Информатика 6 59000
5 Козлова М.А. Экономика 10 71000

Шаг 2. Вычисляем внешнюю операцию — проекцию $\pi_{\text{Кафедра}}$:
Вырезаем только столбец «Кафедра». Из строк Иванова и Смирнова получаем два значения «Информатика». По правилу Кодда дубликаты схлопываются!

Финальный результат $\pi_{\text{Кафедра}}(T')$:

Кафедра
Информатика
Экономика

Итог: Отношение степени 1 и мощности 2.

6. Сопоставление с языком SQL

В реляционных СУБД декларативным языком взаимодействия является SQL. Важно понимать, как формулы реляционной алгебры транслируются в реальные команды:

-- Реляционная селекция: sigma_{стаж >= 6}(T)
SELECT * 
FROM Teachers 
WHERE experience >= 6;

-- Реляционная проекция с устранением дубликатов: pi_{department}(T)
SELECT DISTINCT department 
FROM Teachers;

-- SQL-проекция БЕЗ устранения дубликатов (мультимножество):
SELECT department 
FROM Teachers;

-- Суперпозиция: pi_{department}(sigma_{experience >= 6 AND salary < 80000}(T))
SELECT DISTINCT department
FROM Teachers
WHERE experience >= 6 AND salary < 80000;
Почему в SQL проекция по умолчанию не удаляет дубликаты?
Устранение дубликатов требует от СУБД выполнения тяжелых операций: либо сортировки всего массива строк ($O(N \log N)$), либо построения хэш-таблицы в памяти ($O(N)$ памяти). Если программисту не требуется уникальность, выполнение простого SELECT col FROM tbl экономит вычислительные ресурсы сервера. Для получения математической проекции программист явно указывает директиву DISTINCT.

7. Обзор теоретико-множественных операций реляционной алгебры

Помимо унарных операций, реляционная алгебра включает четыре базовые бинарные операции над парами отношений $R$ и $S$:

Операция и символ Математическое определение Требования и эквивалент в SQL
Объединение ($R \cup S$) $\{ t \mid t \in R \lor t \in S \}$ Требуется совместимость по объединению (одинаковые схемы и типы). SQL: UNION (удаляет дубли), UNION ALL (с дублями).
Пересечение ($R \cap S$) $\{ t \mid t \in R \land t \in S \}$ Требуется совместимость по объединению. SQL: INTERSECT.
Разность ($R \setminus S$) $\{ t \mid t \in R \land t \notin S \}$ Отношение кортежей, которые есть в $R$, но отсутствуют в $S$. SQL: EXCEPT (или MINUS в Oracle).
Декартово произведение ($R \times S$) $\{ t_r \circ t_s \mid t_r \in R, t_s \in S \}$ Сцепление каждой строки $R$ с каждой строкой $S$. Степень = $\text{deg}(R) + \text{deg}(S)$, мощность = $\text{card}(R) \times \text{card}(S)$. SQL: CROSS JOIN.

Вопросы для самопроверки

  1. Что формулирует свойство реляционной замкнутости и почему без него невозможны подзапросы в SQL?
  2. В чем геометрическое различие между селекцией и проекцией? Какая операция изменяет количество столбцов, а какая — количество строк?
  3. Исходная таблица содержит 100 строк. Какова минимальная и максимальная теоретическая мощность отношения, полученного после выполнения проекции $\pi_A(R)$?
  4. Почему в стандарте SQL операция SELECT column FROM table не является чистой проекцией Кодда, и какое ключевое слово делает ее таковой?
  5. Почему выражение $\sigma_{\text{Возраст} > 25}(\pi_{\text{ФИО}}(Студенты))$ вызовет синтаксическую ошибку в реляционной СУБД?