Базы данных. Лекции БД. Лекция 5 Основные понятия информационных систем 5 История развития компьютеризации информационных процессов и систем. 5
![]()
|
Лекция 4.5.Обзор реляционной алгебрыТретья часть реляционной модели, манипуляционная часть, утверждает, что доступ к реляционным данным осуществляется при помощи реляционной алгебры или эквивалентного ему реляционного исчисления. В реализациях конкретных реляционных СУБД сейчас не используется в чистом виде ни реляционная алгебра, ни реляционное исчисление. Фактическим стандартом доступа к реляционным данным стал язык SQL (Structured Query Language). Язык SQL представляет собой смесь операторов реляционной алгебры и выражений реляционного исчисления, использующий синтаксис, близкий к фразам английского языка и расширенный дополнительными возможностями, отсутствующими в реляционной алгебре и реляционном исчислении. Вообще, язык доступа к данным называется реляционно полным, если он по выразительной силе не уступает реляционной алгебре (или, что то же самое, реляционному исчислению), т.е. любая операция реляционной алгебры может быть выражен средствами этого языка. Именно таким и является язык SQL. 5.1.Замкнутость реляционной алгебрыРеляционная алгебра представляет собой набор операций, использующих отношения в качестве аргументов, и возвращающие отношения в качестве результата. Таким образом, реляционная операция ![]() ![]() Реляционная алгебра является замкнутой, т.к. в качестве аргументов в реляционные операторы можно подставлять другие реляционные операторы, подходящие по типу: ![]() Таким образом, в реляционных выражениях можно использовать вложенные выражения сколь угодно сложной структуры. Каждое отношение обязано иметь уникальное имя в пределах базы данных. Имя отношения, полученного в результате выполнения реляционной операции, определяется в левой части равенства. Однако можно не требовать наличия имен от отношений, полученных в результате реляционных выражений, если эти отношения подставляются в качестве аргументов в другие реляционные выражения. Такие отношения будем называть неименованными отношениями. 5.2.Операции реляционной алгебры.Традиционно, вслед за Коддом [], определяют восемь реляционных операций, объединенных в две группы. Теоретико-множественные операции: Объединение Пересечение Вычитание Декартово произведение Специальные реляционные операции: Выборка Проекция Соединение Деление Не все они являются независимыми, т.е. некоторые из этих операций могут быть выражены через другие реляционные операции. Отношения, совместимые по типу Некоторые реляционные операции (например, объединение) требуют, чтобы отношения имели одинаковые заголовки. Если исходные отношения имеют разные атрибуты (количество, название, домены ) то, очевидно, что множество, являющееся объединением таких разнотипных кортежей нельзя представить в виде отношения. Определение 1. Будем называть отношения совместимыми по типу, если они имеют идентичные заголовки, а именно, Отношения имеют одно и то же множество имен атрибутов, т.е. для любого атрибута в одном отношении найдется атрибут с таким же наименованием в другом отношении, Атрибуты с одинаковыми именами определены на одних и тех же доменах. Некоторые отношения не являются совместимыми по типу, но становятся таковыми после некоторого переименования атрибутов. Для того чтобы такие отношения можно было использовать в реляционных операторах, вводится вспомогательная операция переименования атрибутов. Операция переименования атрибутов Операция переименования атрибутов имеет следующий синтаксис: ![]() где ![]() ![]() ![]() В результате применения операции переименования атрибутов получаем новое отношение, с измененными именами атрибутов. 5.2.1.Теоретико-множественные операции.5.2.1.1.ОбъединениеОпределение 2. Объединением двух совместимых по типу отношений ![]() ![]() ![]() ![]() ![]() ![]() Синтаксис операции объединения: ![]() Замечание. Объединение, как и любое отношение, не может содержать одинаковых кортежей. Поэтому, если некоторый кортеж входит и в отношение ![]() ![]() 5.2.1.2. ПересечениеОпределение 3. Пересечением двух совместимых по типу отношений ![]() ![]() ![]() ![]() ![]() ![]() Синтаксис операции пересечения: ![]() 5.2.1.3.ВычитаниеОпределение 4. Вычитанием двух совместимых по типу отношений ![]() ![]() ![]() ![]() ![]() ![]() Синтаксис операции вычитания: ![]() 5.2.1.4.Декартово произведениеОпределение 5. Декартовым произведением двух отношений ![]() ![]() ![]() ![]() ![]() а тело состоит из кортежей, являющихся сцеплением кортежей отношений ![]() ![]() ![]() ![]() ![]() Синтаксис операции декартового произведения: ![]() Замечание. Мощность произведения ![]() ![]() ![]() ![]() ![]() Замечание. Если в отношения ![]() ![]() Замечание. Перемножать можно любые два отношения, совместимость по типу при этом не требуется. 5.2.2.Специальные реляционные операторы5.2.2.1.Выборка (ограничение, селекция)Определение 6. Выборкой (ограничением, селекцией) на отношении ![]() ![]() ![]() ![]() ![]() ![]() В простейшем случае условие ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Синтаксис операции выборки: ![]() ![]() Смысл операции выборки очевиден - выбрать кортежи отношения, удовлетворяющие некоторому условию. Таким образом, операция выборки дает "горизонтальный срез" отношения по некоторому условию. 5.2.2.2.ПроекцияОпределение 7. Проекцией отношения ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Синтаксис операции проекции: ![]() Замечание. Операция проекции дает "вертикальный срез" отношения, в котором удалены все возникшие при таком срезе дубликаты кортежей. 5.2.2.3.СоединениеОперация соединения отношений, наряду с операциями выборки и проекции, является одной из наиболее важных реляционных операций. Обычно рассматривается несколько разновидностей операции соединения: Общая операция соединения ![]() Экви-соединение Естественное соединение Наиболее важным из этих частных случаев является операция естественного соединения. Все разновидности соединения являются частными случаями общей операции соединения. Общая операция соединения Определение 8. Соединением отношений ![]() ![]() ![]() ![]() ![]() ![]() ![]() Таким образом, операция соединения есть результат последовательного применения операций декартового произведения и выборки. Если в отношениях ![]() ![]() Тэта-соединение Определение 9. Пусть отношение ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Это частный случай операции общего соединения. Иногда, для операции ![]() ![]() Экви-соединение Наиболее важным частным случаем ![]() ![]() Синтаксис экви-соединения: ![]() Недостатком экви-соединения является то, что если соединение происходит по атрибутам с одинаковыми наименованиями (а так чаще всего и происходит!), то в результирующем отношении появляется два атрибута с одинаковыми значениями. Избавиться от этого недостатка можно, взяв проекцию по всем атрибутам, кроме одного из дублирующих. Именно так действует естественное соединение. Естественное соединение Определение 10. Пусть даны отношения ![]() ![]() ![]() Тогда естественным соединением отношений ![]() ![]() ![]() ![]() ![]() ![]() Естественное соединение настолько важно, что для него используют специальный синтаксис: ![]() Замечание. В синтаксисе естественного соединения не указываются, по каким атрибутам производится соединение. Естественное соединение производится по всем одинаковым атрибутам. Замечание. Естественное соединение эквивалентно следующей последовательности реляционных операций: Переименовать одинаковые атрибуты в отношениях Выполнить декартово произведение отношений Выполнить выборку по совпадающим значениям атрибутов, имевших одинаковые имена Выполнить проекцию, удалив повторяющиеся атрибуты Переименовать атрибуты, вернув им первоначальные имена Замечание. Можно выполнять последовательное естественное соединение нескольких отношений. Нетрудно проверить, что естественное соединение (как, впрочем, и соединение общего вида) обладает свойством ассоциативности, т.е. ![]() ![]() 5.2.2.4.ДелениеОпределение 11. Пусть даны отношения ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Отношение ![]() ![]() Синтаксис операции деления: ![]() Замечание. Типичные запросы, реализуемые с помощью операции деления, обычно в своей формулировке имеют слово "все" . Пример 5.1. "какие поставщики поставляют все детали?. В качестве делимого возьмем отношение, содержащее номера поставщиков и номера поставляемых ими деталей:
В качестве делителя отношение содержащее список номеров всех деталей :
Деление ![]()
5.2.3.Зависимые реляционные операторыНе все операторы реляционной алгебры являются независимыми - некоторые из них выражаются через другие реляционные операторы. Операция соединения Операция соединения определяется через операторы декартового произведения и выборки. Для операции естественного соединения добавляется операция проекции. Операция пересечения Операция пересечения выражается через вычитание следующим образом: ![]() Операция деления Операция деления выражается через операторы вычитания, декартового произведения и проекции следующим образом: ![]() Таким образом показано, что операторы соединения, пересечения и деления можно выразить через другие реляционные операторы, т.е. эти операторы не являются примитивными. 5.2.4.Примитивные реляционные операторыОставшиеся реляционные операторы (объединение, вычитание, декартово произведение, выборка, проекция) являются примитивными операторами - их нельзя выразить друг через друга. Операция декартового произведения Операция декартового произведения - это единственный оператор, увеличивающий количество атрибутов, поэтому его нельзя выразить через объединение, вычитание, выборку, проекцию. Операция проекции Операция проекции - единственный оператор, уменьшающий количество атрибутов, поэтому его нельзя выразить через объединение, вычитание, декартово произведение, выборку. Операция выборки Операция выборки - единственный оператор, позволяющий проводить сравнения по атрибутам отношения, поэтому его нельзя выразить через объединение, вычитание, декартово произведение, проекцию. Операции объединения и вычитания 5.2.5.Запросы, невыразимые средствами реляционной алгебрыНесмотря на мощь языка реляционной алгебры, имеется ряд типов запросов, которые принципиально нельзя выразить только при помощи операторов реляционной алгебры. Это вовсе не означает, что ответы на эти запросы нельзя получить вообще. Просто, для получения ответов на подобные запросы приходится применять процедурные расширения реляционных языков. Невыразимость транзитивного замыкания реляционными операторами Следующий пример иллюстрирует класс запросов, невыразимых средствами реляционной алгебры или реляционного исчисления по причине невыразимости средствами реляционной алгебры транзитивного замыкания отношений (см. гл. 1). Пример 5.2. Рассмотрим отношение, описывающее сотрудников некоего предприятия. Отношение содержит данные о табельном номере сотрудника, фамилии, должности и табельном номере руководителя сотрудника – СОТРУДНИКИ (ТАБ_НОМ, ФАМИЛИЯ, ДОЛЖНОСТЬ, ТАБ_НОМ_РУК):
Рассмотрим запрос "Перечислить всех руководителей (прямых и непрямых) данного сотрудника". Ответом на запрос может быть получен при помощи понятия транзитивного замыкания. Однако транзитивное замыкание не может быть выражено операторами реляционной алгебры. Определение . Пусть отношение ![]() ![]() ![]() ![]() ![]() ![]() либо кортеж ![]() либо найдется конечная последовательность элементов ![]() ![]() ![]() Очевидно, что ![]() Кросс-таблицы Построение кросс-таблицы средствами реляционной алгебры невозможно, т.к. для этого требуется превратить данные в ячейках таблицы в наименования новых столбцов таблицы. |