Операции соединения. Как правило, пользователей интересует лишь некоторая часть всех комбинаций кортежей декартового произведения, которая удовлетворяет заданному условию. Поэтому вместо декартового произведения обычно используется одна из самых важных операций реляционной алгебры – операция соединения. В результате ее выполнения на базе двух исходных отношений создается некоторое новое отношение. Операция соединения является производной от операции декартового произведения, так как она эквивалентна операции выборки из декартового произведения двух операндов-отношений тех кортежей, которые удовлетворяют условию, указанному в предикате соединения в качестве формулы выборки. С точки зрения эффективной реализации в РСУБД эта операция является одной из самых трудных и часто оказывается одной из основных причин, вызывающих проблемы с производительностью, свойственные всем реляционным системам.
Перечислим различные типы операций соединения, которые несколько отличаются друг от друга и могут быть в той или иной степени полезны. (Более подробно об операциях соединения и других операциях реляционной алгебры Вы можете узнать из литературы, приведенной в начале юниты).
• Тета-соединение (-join). Операция тета-соединения определяет отношение, которое содержит кортежи из декартового произведения отношений R и S, удовлетворяющие предикату F. Предикат F имеет вид R. аiS.bi, где вместо может быть указан один из операторов сравнения (<, <=, >, >=, = или ~). Как и в случае с декартовым произведением, степенью тета-соединения называется сумма степеней операндов-отношений R и S.
• Соединение по эквивалентности (equi-join). Это соединение является частным видом тета-соединения. Если предикат F содержит только оператор равенства (=), то соединение называетсясоединением по эквивалентности (equi-join).
• Естественное соединение (natural join). Естественным соединением называется соединение по эквивалентности двух отношений R и S, выполненное по всем общим атрибутам х, из результатов которого исключается по одному экземпляру каждого общего атрибута.
Степенью естественного соединения называется сумма степеней операндов-отношений R и S минус количество атрибутов х.
• Внешнее соединение (outer join). Зачастую при соединении двух отношений кортеж из одного отношения не находит соответствующего кортежа в другом отношении. Иначе говоря, в столбцах соединения оказываются несовпадающие значения. Может потребоваться, чтобы строка из одного отношения была представлена в результате соединения даже если в другом отношении нет совпадающего значения. Эта цель может быть достигнута с помощью внешнего соединения.
Левым внешним соединением называется соединение, при котором кортежи отношения R, не имеющие совпадающих значений в общих столбцах отношения S, также включаются в результирующее отношение.
Для обозначения отсутствующих значений во втором отношении используется определитель NULL. Внешнее соединение становится все более распространенным в РСУБД, к тому же в настоящее время оно является оператором, включенным в новый стандарт SQL. Преимуществом внешнего соединения является то, что при таком соединении сохраняется исходная информация, т.е. внешнее соединение сохраняет кортежи, которые были бы утрачены при использовании других типов соединений.
Аналогично строится правое внешнее соединение, в результирующем отношении которого содержатся все кортежи правого отношения. Кроме того, существует и полное внешнее соединение, в результирующее отношение которого помещаются все кортежи из обоих отношений и в котором для обозначения несовпадающих значений кортежей используются определители NULL.
• Полусоединение (semi-join). Операция полусоединения определяет отношение, которое содержит те кортежи отношения R, которые входят в соединение отношений R и S.
Преимущество полусоединения заключается в том, что оно позволяет сократить количество кортежей, которые нужно обработать для получения соединения. Это особенно полезно при вычислении соединений в распределенных системах.
Оператор деления. Оператор деления может быть полезен в случае запросов особого типа, которые довольно часто встречаются в приложениях баз данных. Предположим, что отношение R определено на множестве атрибутов А, а отношение S – на множестве атрибутов В, причем В А (т.е. В является подмножеством А). Пусть С = А – В, т.е. С является множеством атрибутов отношения R, которые не являются атрибутами отношения S. Результатом оператора деления является набор кортежей отношения R, определенных на множестве атрибутов С, которые соответствуют комбинации всех кортежей отношения S.
Реляционная модель данных. Как уже говорилось, наиболее популярны реляционные модели данных. В соответствии с реляционной моделью данных данные представляются в виде совокупности таблиц, над которыми могут выполняться операции, формулируемые в терминах реляционной алгебры или реляционного исчисления.
В отличие от иерархических и сетевых моделей данных в реляционной модели операции над объектами имеют теоретико-множественный характер. Это дает возможность пользователям формулировать их запросы более компактно, в терминах более крупных агрегатов данных.
Основные понятия реляционных баз данных. Необходимо иметь возможность уникальной идентификации каждого отдельного кортежа отношения по значениям его атрибутов. Рассмотрим терминологию, используемую для обозначения реляционных ключей на примере отношений Branch и Staff (табл. 14).
Таблица 14
Staff
Branch
Суперключ – атрибут или множество атрибутов, которое единственным образом (superkey) идентифицирует кортеж данного отношения.
Поскольку суперключ может содержать дополнительные атрибуты, которые необязательны для уникальной идентификации кортежа, нас будут интересовать суперключи, состоящие только из тех атрибутов, которые действительно необходимы для уникальной идентификации кортежей.
Потенциальный ключ – суперключ, который не содержит подмножества, также являющегося суперключом данного отношения.
Потенциальный ключ К для данного отношения R обладает двумя свойствами:
• уникальность. В каждом кортеже отношения R значение ключа К единственным образом идентифицируют этот кортеж;
• неприводимость. Никакое допустимое подмножество ключа К не обладает свойством уникальности.
Отношение может иметь несколько потенциальных ключей. Если ключ состоит из нескольких атрибутов, то он называется составным ключом. Рассмотрим отношение Branch. Конкретное значение атрибута City может определять сразу несколько отделений компании (например, в Москве может находиться два отделения). Поэтому данный атрибут не может быть выбран в качестве потенциального ключа. Однако, поскольку для каждого отделения компании задается его уникальный номер, каждое значение этого номера (атрибут Вnо) может определять не больше одного кортежа, а потому Вnо является потенциальным ключом. Аналогично, атрибуты Tel_No и Fax_No также являются потенциальными ключами этого отношения.
Обратите внимание на то, что любой конкретный набор кортежей отношения нельзя использовать для доказательства того, что некий атрибут или комбинация атрибутов являются потенциальным ключом. Тот факт, что в некоторый момент времени не существует значений-дубликатов, совсем не означает, что их не может быть вообще. Однако наличие значений-дубликатов в конкретном существующем наборе кортежей вполне может быть использовано для демонстрации того, что некоторая комбинация атрибутов не может быть потенциальным ключом. Для идентификации потенциального ключа требуется знать смысл используемых атрибутов в “реальном мире”, только это позволит обоснованно принять решение о возможности существования значений-дубликатов. Только исходя из подобной семантической информации можно гарантировать, что некоторая комбинация атрибутов является потенциальным ключом отношения. Например, на основании данных отношения Branch можно решить, что подходящим потенциальным ключом для отношения Staff вполне может быть атрибут LName, содержащий фамилию сотрудника. Однако, хотя в данный момент в организации имеется только один сотрудник с фамилией Смирнова, при зачислении в организацию нового сотрудника с фамилией Смирнова атрибут LName уже нельзя будет использовать в качестве потенциального ключа.
Первичный ключ – это потенциальный ключ, который выбран для уникальной идентификации кортежей внутри отношения.
Поскольку отношение не содержит кортежей-дубликатов, всегда можно уникальным образом идентифицировать каждую его строку. Это значит, что отношение всегда имеет первичный ключ. В худшем случае все множество атрибутов может использоваться как первичный ключ, но обычно, чтобы различить кортежи, достаточно использовать несколько меньшее подмножество атрибутов. Потенциальные ключи, которые не выбраны в качестве первичного ключа, называются альтернативными ключами. Если в отношении Branch выбрать в качестве первичного ключа атрибут Bno, то альтернативными ключами этого отношения будут атрибуты Tel_No и Fax_No.
Внешний ключ – это атрибут или множество атрибутов внутри отношения, которое соответствует потенциальному ключу некоторого (может быть, того же самого) отношения.
Если некий атрибут присутствует в нескольких отношениях, то его наличие обычно отражает определенную связь между кортежами этих отношений. Например, атрибут Вnо намеренно включен в отношения Branch и Staff для установления связи между сведениями об отделениях компании и сведениями о сотрудниках, которые работают в каждом из отделений. В отношении Branch атрибут Вnо является первичным ключом, а в отношении Staff он введен для установления соответствия между сведениями о сотрудниках и сведениями о тех отделениях компании, в которых они работают. В отношении Staff атрибут Вno является внешним ключом. В таком случае говорят, что атрибут Вnо в отношении Staff ссылается на первичный ключ, т.е. на атрибут Вnо в базовом отношении Branch. Эти общие атрибуты играют важную роль в манипулировании данными.