В чём практический смысл замкнутости реляционной алгебры?
Замкнутость реляционной алгебры означает, что результат каждой её операции снова является отношением. Поэтому результат одной операции можно непосредственно передать следующей, строя сложные запросы из простых шагов.
Это обеспечивает композиционность: промежуточный результат имеет структуру отношения — схему и множество кортежей, — а значит, к нему снова применимы выборка, проекция, соединение и другие операции.
Реляционная модель была создана как математическая основа для работы с данными через их свойства и связи, а не через процедуру обхода физических структур хранения. Для этого требовался формальный язык, в котором сложный запрос можно было бы последовательно собирать из элементарных операций.
Замкнутость решала исходную проблему композиции. Без неё результат операции мог бы быть лишь специальным промежуточным объектом, непригодным для дальнейшей обработки теми же средствами.
Запрос к данным часто состоит из цепочки действий: сначала отбираются строки, затем оставляются нужные атрибуты, после этого выполняется соединение с другим набором данных. Если промежуточные результаты имеют разные и несовместимые формы, построение такого запроса становится сложным и зависит от специальных переходов между операциями.
Неверное понимание замкнутости приводит к ошибочному выводу, будто каждая операция обязана сохранять исходную схему без изменений. На самом деле отношение сохраняется как тип объекта, но его схема, количество атрибутов и количество кортежей могут измениться.
В реляционной алгебре выборка возвращает отношение с теми же атрибутами, но, возможно, с меньшим числом кортежей. Проекция также возвращает отношение, однако меняет набор атрибутов. Соединение формирует новое отношение, объединяя атрибуты операндов и отбирая согласованные комбинации кортежей.
Именно поэтому операции можно вкладывать или располагать последовательно. Например, сначала можно получить отношение заказов определённого клиента, затем соединить его с отношением товаров, а затем спроецировать только идентификаторы и названия товаров. Каждый промежуточный результат остаётся допустимым входом для следующей операции.
Замкнутость не означает сохранение степени отношения, то есть числа атрибутов. Она означает сохранение общего типа результата: результатом является новое отношение. Число строк также не обязано сохраняться: выборка может его уменьшить, соединение — увеличить, а пересечение — уменьшить или дать пустое отношение.
Важно различать идеальную реляционную алгебру и SQL. В классической реляционной модели отношения обычно рассматриваются как множества без повторяющихся кортежей и без значения NULL. SQL во многих операциях использует мультимножества, допускает NULL и имеет особенности трёхзначной логики, поэтому его результат не всегда полностью совпадает с результатом соответствующей операции реляционной алгебры.
В отчёте нужно найти товары, проданные в выбранном магазине, соединить их с каталогом и вывести только идентификатор и название товара. Возможны два подхода: вручную материализовать каждый этап во временную таблицу или выразить всю цепочку как составной запрос.
Временные таблицы могут упростить отладку и позволить повторно использовать промежуточный результат, но требуют управления жизненным циклом объектов и дополнительными операциями записи. Составной запрос лучше отражает композиционность реляционной алгебры и обычно оставляет оптимизатору больше свободы.
Выбирают составной запрос, если промежуточный результат не нужен отдельно. Благодаря замкнутости каждый этап можно рассматривать как самостоятельное отношение, а СУБД может перестроить эквивалентный план выполнения без изменения логического результата.
1. Всегда ли пустой результат является отношением?
Да. Пустое отношение имеет нулевую мощность, но сохраняет схему: известны его атрибуты и их типы. Поэтому его можно соединять, проецировать или объединять с другими отношениями по тем же правилам, что и непустое отношение.
2. Означает ли замкнутость, что результат сохраняет исходные столбцы?
Нет. Замкнутость сохраняет тип объекта, а не его схему. Проекция может удалить атрибуты, соединение — добавить атрибуты, а переименование — изменить их имена; все эти результаты всё равно остаются отношениями.
3. Можно ли утверждать, что любой результат SQL полностью соответствует отношению реляционной алгебры?
Нет, это зависит от используемой семантики. SQL обычно допускает повторяющиеся строки, применяет трёхзначную логику для NULL и отдельно рассматривает порядок строк. Поэтому SQL следует реляционной идее и сохраняет композиционность табличных результатов, но не является буквальной реализацией классической алгебры множеств без дополнительных оговорок.