Зачем в реляционной алгебре переименование атрибутов нужно перед соединением отношения с самим собой?
Переименование нужно, чтобы различать две независимые роли одного и того же отношения в операции самосоединения. Без него одинаковые имена атрибутов становятся неоднозначными, а естественное соединение может начать сравнивать столбцы, которые не должны участвовать в условии.
В SQL ту же задачу обычно решают псевдонимы таблиц: они позволяют отдельно обращаться к каждой копии отношения и явно задавать условие соединения.
Реляционная алгебра работает с отношениями, атрибуты которых имеют имена. При соединении отношения с самим собой одна и та же схема появляется в операции дважды, но эти экземпляры должны представлять разные роли, например сотрудника и его руководителя.
Оператор переименования устраняет конфликт имен и делает эти роли различимыми. Это особенно важно для самосоединений, сравнений строк одного отношения и формального описания запросов, где одна таблица используется несколько раз.
Рассмотрим отношение сотрудников, в котором есть идентификатор сотрудника, имя и идентификатор руководителя. Чтобы найти пары «сотрудник — руководитель», нужно сопоставить идентификатор руководителя одной строки с идентификатором сотрудника другой строки того же отношения.
Если обе копии сохраняют одинаковые имена атрибутов, непонятно, к какой копии относится каждый атрибут. Неправильное естественное соединение может сравнить все одноименные атрибуты, включая имя сотрудника с именем руководителя, и вернуть пустой или логически неверный результат.
Переименование создает две логические копии одного отношения с различающимися именами или ролями атрибутов. После этого условие соединения однозначно указывает, какой атрибут первой копии сравнивается с каким атрибутом второй.
В SQL эквивалентный механизм выражается через псевдонимы таблиц:
Здесь e и m — две роли одного отношения employees. Условие сравнивает e.manager_id с m.employee_id, а не все совпадающие по имени столбцы.
Важно отличать переименование от физического копирования данных. СУБД не обязана создавать вторую таблицу или дублировать строки: это логическое различение ссылок на одно отношение внутри выражения.
При естественном соединении после переименования может не остаться общих имен атрибутов. Тогда естественное соединение само по себе не выразит нужное соответствие, и потребуется условное, или theta-соединение. Поэтому переименование решает проблему имен, но не заменяет явное логическое условие.
Компромисс состоит в выборе между краткостью и явностью. Естественное соединение короче, но чувствительно к изменениям схемы и случайным совпадениям имен; явное условие соединения длиннее, зато лучше фиксирует намерение запроса.
В таблице сотрудников хранятся employee_id, name и manager_id. Нужно построить отчет с именем каждого сотрудника и именем его руководителя.
Вариант без различения ролей нельзя надежно интерпретировать: обращения к одинаковым атрибутам неоднозначны. Попытка естественного соединения также рискованна, потому что она может использовать все общие имена, а не только связь между идентификаторами.
Вариант с физической копией таблицы устраняет неоднозначность, но создает лишние данные, усложняет синхронизацию и не нужен для решения запроса. Выбранное решение — самосоединение с двумя псевдонимами и явным условием по идентификаторам.
В результате запрос возвращает нужные пары и сохраняет одну версию исходных данных. При изменении схемы явное условие обычно остается понятным, тогда как поведение естественного соединения может неожиданно измениться из-за нового одноименного столбца.
Нет. Переименование в реляционной алгебре и псевдоним в SQL обычно являются логической операцией внутри выражения. Схема исходной таблицы не меняется, данные не копируются, а различаются только обращения к двум ее экземплярам.
Псевдонимы устраняют неоднозначность обращения, но естественное соединение сопоставляет атрибуты с одинаковыми именами. Если после различения имен общих атрибутов нет, оно не знает, какое бизнес-условие нужно применить. Для связи руководителя с сотрудником требуется явное условие по соответствующим идентификаторам.
Внутреннее самосоединение исключит сотрудников без руководителя, потому что для них не найдется совпадающая строка во второй копии отношения. Если таких сотрудников нужно сохранить в отчете, следует использовать левое внешнее соединение: строка сотрудника останется, а данные руководителя будут представлены неопределенным значением NULL.