Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Реляционная_алгебра.doc
Скачиваний:
2
Добавлен:
22.11.2019
Размер:
2.61 Mб
Скачать

6.11. Резюме

Данная глава посвящается реляционной алгебре. В начале главы обсуждалась важ­ность замкнутости и вложенных выражений; затем выяснилось, что при серьезном подходе к понятию замкнутости необходимы правила наследования имен атрибутов. Здесь же вскользь были упомянуты правила наследования потенциальных ключей.

Начальная алгебра состоит из восьми операций: набора традиционных операций объединения, пересечения, вычитания и произведения и набора специальных реляционных операций выборки, проекции, соединения и деления. К этому изна­чальному набору операций мы добавили операции RENAME (переименование), EXTEND (расширение) и SUMMARIZE (подведение итогов). Некоторые из этих операций требуют, чтобы два оператора были совместимы по типу (ранее такие от­ношения назывались "совместимыми для объединения"). Здесь же подчеркивалось, что эти операции не все примитивны (некоторые из них можно определить посредством других). Далее было показано, как эти операции можно комбинировать в вы­ражения, используемые для выборки, обновления и др. Также кратко обсуждалась идея преобразования этих операций с целью оптимизации (подробнее эта идея бу­дет обсуждаться далее в книге). Рассматривалась возможность пошагового подхода при выполнении сложных запросов.

Реляционная модель также включает в себя операцию реляционного присвоения, которую можно использовать в качестве основы для операций обновления. Отмечалось,

что эти операции выполняются на уровне множеств и должны контролироваться с помощью предиката для рассматриваемого отношения. И наконец, обсуждалась идея реляционных сравнений, которые часто упрощают выражение запросов.

Упражнения

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

читателю предлагается сформулировать некоторые Запросы в виде выражений реляционной алгебры. (Эти упражнения также можно решать и "наоборот": посмотреть алгебраическое выражение в ответе и по нему составить словесный запрос.)

    1. Мы упоминали, что операции объединения, пересечения, произведения и (естественного) соединения обладают свойством коммутативности и ассоциативности. Проверьте эти утверждения.

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

    1. Рассмотрим выражение А JOIN В. Если у отношений А и В заголовки разобщены (т.е. в заголовках нет общих атрибутов), то это выражение эквивалентно такому: А TIМES В. А какому выражению оно будет эквивалентно, если заголовки одинаковые?

    1. Покажите, что пять примитивных операций, которые обсуждались в этой главе, действительно примитивны, т.е. что никакую из них нельзя выразить через четыре ее другие.

    1. В обычной арифметике умножение и деление - взаимообратные операции. Будут ли операции TIМES и DIVIDEВY взаимообратными в реляционной алгебре?

    1. Дана обычная база данных поставщиков и деталей; чему равно выражение

S JOIN SP JOIN P

Предостережение. Здесь есть ловушка!

    1. Пусть А - отношение степени n. Сколько существует различных проекций отношения А?

    1. В обычной арифметике существует специальное число 1, обладающее свойством

n * 1 = 1 * n = n

для любого числа n. Мы говорим, что 1 является нейтральным элементом по отношению к операции умножения. Существует ли отношение, обладающее аналогичными свойствами единицы в реляционной алгебре? Если существует, то какое?

    1. В обычной арифметике существует специальное число 0, обладающее свойством

n * 0 = 0 * n = 0

для любого числа n. Существует ли отношение, обладающее аналогичными свойствами нуля в реляционной алгебре? Если существует, то какое?

    1. Выясните, как ведут себя алгебраические операции, описанные в этой главе, на отношениях, которые получаются в ответах к двум предыдущим упражнениям.

    1. Пусть А и В - два произвольных отношения. Укажите потенциальные ключи для следующих отношений:

а) произвольная выборка А;

б) произвольная проекция А;

в) А TIМES B;

г) А UNlON B

д) А INTERSECТ B;

е) А МINUS B;

ж) А JOIN B;

з) А DIVIDEВY B;

и) произвольное (по-разному) расширение А;

к) произвольное подведение итогов в А.

Предполагается, что в каждом случае отношения А и В удовлетворяют необходимым для рассматриваемой операции условиям (например, для операции UNION они совместимы по типу).

    1. Выше в этой главе мы говорили, что реляционное свойство замкнутости так же важно, как и арифметическое свойство замкнутости. Однако в арифметике существует одна неприятная ситуация, в которой нарушается свойство замкнутости, а именно деление на нуль. Существует ли аналогичная ситуация в реляционной алгебре?

Упражнения по запросам

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

S ( S#, SNAМE, SТAТUS, CIТY )

PRIМARY КЕУ ( S# )

Р ( Р#, PNAМE, COLOR, WEIGНТ, CIТY )

PRIМARY КЕУ ( Р# )

J ( J#, JNAМE, CIТY )

PRIМARY КЕУ ( J# )

SPJ ( S#, Р#, J#, QTY )

PRIМARY КЕУ ( S#, Р#, J# )

FOREIGN КЕУ (S#) REFERENCES S

FOREIGN КЕУ ( Р# ) REFERENCES Р

FOREIGN КЕУ ( J# ) REFERENCES J

    1. Получить полную информацию обо всех проектах.

    2. Получить полную информацию обо всех проектах в Лондоне.

    3. Получить номера поставщиков, которые обеспечивают проект J1.

    4. Получить все отправки, где количество находится в диапазоне от 300 до 750 включительно.

    5. Получить все сочетания "цвета деталей - города деталей".

    6. Получить все такие тройки “номера поставщиков-номера деталей -номера проектов", для которых выводимые поставщик, деталь и проект размещены в одном городе.

    7. Получить все такие тройки "номера поставщиков-номера деталей -номера проектов", для которых выводимые поставщик, деталь и проект не размещены в одном городе.

    8. Получить все такие тройки "номера поставщиков-номера деталей--номера проектов", для которых никакие из двух выводимых поставщиков, деталей и проектов не размещены в одном городе.

    9. Получить номера деталей, поставляемых поставщиком в Лондоне.

    10. Получить номера деталей, поставляемых поставщиком в Лондоне для проекта в Лондоне.

    11. Получить все пары названий городов, для которых поставщик из первого города обеспечивает проект во втором городе.

    12. Получить номера деталей, поставляемых для всех проектов, обеспечиваемых поставщиком из того же города, где размещен проект.

    13. Получить номера проектов, обеспечиваемых по крайней мере одним поставщиком не из того же города.

    14. Получить все такие пары номеров деталей, которые обе поставляются одно­временно одним поставщиком.

    15. Получить общее число проектов, обеспечиваемых поставщиком S1.

    16. Получить общее количество деталей Р1, поставляемых поставщиком S 1.

    17. Для каждой детали, поставляемой для проекта, получить номер детали, номер проекта и соответствующее общее количество.

    18. Получить номера деталей, поставляемых для некоторого проекта со средним количеством больше 320.

    19. Получить имена проектов, обеспечиваемых поставщиком S1.

    20. Получить цвета деталей, поставляемых поставщиком S1.

    21. Получить номера деталей, поставляемых для какого-либо проекта в Лондоне.

    22. Получить номера проектов, использующих, по крайней мере одну деталь, имеющуюся у поставщика S 1.

    23. Получить номера поставщиков, поставляющих по крайней мере одну деталь, поставляемую по крайней мере одним поставщиком, который поставляет по крайней мере одну красную деталь.

    24. Получить номера поставщиков со статусом, меньшим чем у поставщика S 1.

    25. Получить номера проектов, город которых стоит первым в алфавитном спи­ске городов.

    26. Получить номера проектов, для которых среднее количество поставляемых деталей Р1 больше, чем наибольшее количество любых деталей, поставляе­мых для проекта J 1.

    27. Получить номера поставщиков, поставляющих деталь Р1 для некоторого проекта в количестве, большем среднего количества деталей Р 1 в поставках для этого проекта.

    28. Получить номера проектов, для которых не поставляются красные детали поставщиками из Лондона.

    29. Получить номера проектов, полностью обеспечиваемых поставщиком S 1.

    30. Получить номера деталей, поставляемых для лондонских проектов.

    31. Получить номера поставщиков, поставляющих одну и ту же деталь для всех проектов.

    32. Получить номера проектов, обеспечиваемых по крайней мере всеми деталями поставщика S 1.

    33. Получить все города, в которых расположен по крайней мере один поставщик, одна деталь или один проект.

    34. Получить номера деталей, поставляемых либо лондонским поставщиком, либо для лондонского проекта.

    35. Получить пары "номер поставщика-номер детали", такие, что данный поставщик не поставляет данную деталь.

    36. Получить все пары номеров поставщиков, скажем, Sx и Sy, такие, что оба эти поставщика поставляют в точности одно и то же множество деталей. (Выражаю благодарность г-ну Фатма Мили (Fatma Mili) из Окландовского Университета (Рочестер, Мичиган), предложившему эту задачу.)

Список литературы.

    1. Codd E.F. А Relational Model of Data for Large Shared Data Ваnks // САСМ. - 1970. - 13, №6. (Переиздано: Milestones of Research - Selected Papers 1958-1982 (САСМ 25th Anniversary Issue) // САСМ. - 1983. - 26, № 1.)

Первая статья Кодда о реляционной модели, в которой даны определения алгебраических операций, перечисленных ниже. Интересно отметить, что определения выборки и соединения отличались от современных определений, а список операций включал операции связи и композиции, которые в настоящее время редко используются. Далее предполагается, что Х, У и т.д. представляют атрибуты или при необходимости сочетание атрибутов.

  • Операция перестановки - переупорядочение атрибутов отношения слева направо; эта операция предназначалась для использования исключительно на внутреннем уровне системы, поэтому, естественно, такое упорядочение атрибутов не имеет никакого отношения к пользователю.

  • Операция выборки - для данных отношений А {Х, У} и В {У} выборка из отношения А по В определяется как такое максимальное подмножество отношения А, что А [У] будет подмножеством (не обязательно собственным подмножеством) отношения В.

  • Операция проекции более или менее соответствует сегодняшнему представлению.

  • Несколько видов операции соединения (рассматриваются ниже).

  • Операция связи - дано отношение A{X1,X2, ... ,Хn}, связью отношения А будет выборка кортежей отношения А, для которых A[Xn]=A[X1] - выборка в том смысле, в каком этот термин использовался в данной главе, а не в смысле приведенного выше определения.

  • Операция композиции - для данных отношений А {Х, У} и В {У, Z} композиция отношений А и В представляет собой проекцию по множеству атрибутов {Х;Z} некоторого соединения отношения А с отношением В по атрибуту У.

Уточним некоторые вопросы относительно операции соединения. Даны отношения А {Х, У} и В {У, Z}, в статье соединение отношений А и В определяется как отношение С{Х, У, Z}, такое, что С[X;Y]= А и C[Y,Z]=B. Естественное соединение (называемое в статье линейным естественным соединением для того, чтобы отличать его от другого вида соединения, называемого в статье циклическим соединением) - это важный частный случай, и он в общем не является единственно возможным. Заметьте, что θ-соединения (в отличие от "линейных" соединений), т.е. соединения, в которых используются операторы скалярного сравнения, отличные от оператора "равно", не рассматриваются.

    1. Codd E.F. Relational Completeness of Data Base SubIanguages // Data Base Systems, Courant Computer Science Symposia Series 6. - Englewood Cliffs, N.J.: Prentice-Hall, 1972

Статья включает формальное определение исходной версии реляционной алгебры, которая близка к версии, рассмотренной в настоящей главе. Определены операторы объединения, пересечения, вычитания, расширения, декартова произведения, проекции, е-соединения (и естественного соединения), деления и θ -выборки. Ниже приведены принципиальные различия в определениях статьи и рассмотренной в этой главе версии.

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

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

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

  • Дополнительные сведения: в статье не обсуждаются операции EXTEND, SUMMARIZE, реляционные сравнения и операции обновления.

    1. Darwen Н. Private communication. - 1992.

Предлагается обобщенная версия операции SUMMARIZE, которая решает определенные проблемы, рассмотренные в этой главе. Основная идея заключается в замене заключенного в круглые скобки списка атрибутов в операторе ВУ реляционным выражением

SUMMARIZЕ term ВУ relаtional - expression

ADD aggregate- expression АS attribute

Например:

SUMMARIZЕ SP ВУ S [ S# ] ADD COUNT АS NP

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

SUMMARIZЕ SP ВУ S [ S# ] ADD exp АS Z

определяется следующим образом:

  • Отношение В должно быть совместимо по типу с некоторой проекцией отношения А, т.е. каждый атрибут отношения В должен быть атрибутом отношения А. Пусть атрибутами такой проекции будут А1, А2,..., Аn.

  • Заголовок результата содержит все атрибуты отношения В плюс новый атрибут Z.

  • Заголовок результата содержит все такие кортежи t, которые являются кортежами отношения В, расширенного значением для нового атрибута Z; это новое значение атрибута Z подсчитывается вычислением итогового выражения ехр по всем кортежам отношения А, которые имеют те же самые значения для атрибутов А1; А2, ..., Аn, что и кортеж t

Основное различие между пересмотренным оператором SUММARIZE и версией, описанной выше в этой главе, состоит в том, что результат имеет то же самое кардинальное число, что и отношение В. Но когда возможны следующие ситуации:

  • Если множество всех кортежей отношения А, которые имеют те же самые значения для атрибутов А1; А2, ... , Аn, что и кортеж t, пустое, то итоговое выражение ехр будет применяться к пустому множеству значений. Как уже указывалось в этой главе, для функций COUNT И SUM результат будет равен нулю. Для функции МАХ он будет равен "минус бесконечности" (где "минус бесконечность" - это наименьшее значение в соответствующем домене). Для функции МIN он будет равен "плюс бесконечности" (определяется аналогично). Для функции AVG будет возникать исключительная ситуация.

  • Если отношение В не просто совместимо по типу с некоторой проекцией отношения А, а фактически является такой проекцией, как в примере

SUММARIZE SP BY SP [ S# ] ADD COUNT AS NP

то мы фактически возвращаемся к первоначальному оператору SUММARIZE.

В частности, обратите внимание, что с этой пересмотренной формой оператора SUММARIZE операция

SUММARIZE SP BY TAВLE_DEE ADD SUМ (QTY ) AS GRANUTOTAL

будет выполняться, т.е. возвращать корректный ответ, а именно нуль, даже если отношение SP будет пустым (сравните ситуацию с оператором SUММARIZE, описанную в настоящей главе). См. главу 4, где обсуждается отношение TAВLE_DEE.

    1. Darwen Н., Date C.J. Into the Great Divide // C.J. Date and Hugh Darwen. Relational Database Writings 1989-1991. - Reading, Mass.: Addison-Wesley, 1992.

Оператор деления, как определено выше в этой главе, применяется к делимому отношению и отношению-делителю, которые удовлетворяют следующему требованию: заголовок делителя является собственным подмножеством отношения делимого. В этой статье (благодаря Стефану Тодду) обсуждается обобщение оператора деления, который применяется к любой паре какого бы то ни было отношения. Такой оператор определяется следующим образом. Для данных отношений А {Х, У} и В {У, Z} выражение

А DIVIDEВY В

дает отношение с заголовком {Х, Z} и телом, состоящим из всех кортежей {Х:х, Z:z}, таких что кортеж {Х'х, У:у} содержится в отношении А для всех кортежей { У:у, Z:z}, содержащихся в отношении В. Предположим, например, что у нас есть два отношения (SP{S#, Р#} и PJ{P#, J#}), где SP показывает, какими поставщиками какие детали поставляются, а РJ показывает, какие детали в каком проекте используются. Тогда выражение

SP DIVIDEВY PJ

дает отношение с заголовком {S#, J#}, показывающее такие пары номеров поставщиков и номеров проектов, в которых указанный поставщик поставляет все детали, используемые в указанном проекте. Более того, выражение

PJ DIVIDEВY SP

дает отношение с заголовком {J#, S#}, показывающее такие пары номеров проектов и номеров поставщиков, в которых указанный проект использует все детали, поставляемые указанным поставщиком.

По крайней мере, так было задумано. В статье показано, что ни первоначальная версия операции деления Кодда, ни обобщенная версия Тодда не дают полного решения проблемы (данные выше описания двух выражений DIVIDEBY нельзя назвать исчерпывающими). В статье также показано, что деление Тодда не является в полной мере совместимым дополнением деления Кодда; более того, если эти операторы усовершенствовать так, чтобы они могли решать поставленные задачи, то их нельзя будет назвать операторами "деления"!

Чтобы разобраться, почему оператор DIVIDEBY полностью не решает проблему, для решения которой он предназначался, давайте возвратимся к первоначальной версии оператора, предложенной Коддом. Рассмотрим запрос

"Получить номера поставщиков, которые поставляют все фиолетовые детали". Предположим, что отношение РР - выборка из отношения деталей содержащая лишь кортежи фиолетовых деталей, - уже построено. Тогда запрос выражается следующим образом:

SР [ S#, P#] DIVlDEВY РР [ P# ]

Теперь предположим (и это действительно соответствует нашим примерным данным), что фиолетовых деталей нет и отношение РР пустое, а значит, будет пустой и проекция этого отношения по атрибуту Р#. Но, если фиолетовых деталей нет, значит, каждый поставщик поставляет их все - даже поставщик S5 в наших примерных данных, не поставляющий деталей вообще! А поставщики, не поставляющие деталей, не представлены в отношении SP, значит, получить результат, включающий таких поставщиков, с помощью операции DIVIDEBY невозможно.

Эту проблему можно решить, определив новый оператор "деления по". Пусть отношения А, АВ и В имеют соответственно заголовки {Х}, {Х, У} и {У}. Тогда частным деления А на В по АВ (оператор А DIVIDEВY В PER АВ) будет отношение с заголовком {Х} и телом, состоящим из всех кортежей {Х:х}, таких что кортеж {Х:х, У:у} принадлежит АВ Для всех кортежей {У:у}, принадлежащих В, или в сокращенной форме:

А.Х WНERE FORALL В EXISТS АВ ( А.Х = АВ.Х AND АВ. У = В. У )

(операторы FORALL и EXISТS разъясняются в главе 7). Теперь запрос "Получить номера поставщиков, которые поставляют все фиолетовые детали" можно выразить просто (и корректно):

S [ S# ] DIVIDEBY РР [ P# ] PER SР [ S#, P# ]

Таким образом решается проблема операции деления, предложенной Коддом. Решение проблемы деления по версии Тодда аналогично.

Замечание. Очевидно, можно было бы расширить определение оператора "деления по", чтобы заголовки могли быть надмножествами {Х}, {Х,У} и {У} соответственно. Однако здесь это обсуждаться не будет.

    1. Goldstein R.C., Strnad A.J. Тhе MacAIMS Data Management System // Рrос. 1970 АСМ SICFIDET Workshop оn Data Description and Access. - 1970.

    2. Strnad A.J. Тhе Relational Аррrоасh to the Management of Data Bases // Рrос. IFIP Congress. - Ljubljana, Yugoslavia, 1971.

Система MacAIMS [6.5,6.6] - один из самых ранних примеров системы, поддерживающей n-арные отношения и языки уровня множеств. Она использует алгебраический язык и обладает двумя весьма интересными особенностями.

  • Структура хранения может быть разной для хранимых отношений. Каждый тип структуры управляется компонентом, называемым "модулем реляционной стратегии", специальным для такой структуры, которая скрывает детали хранения от других частей системы (и конечно, от пользователя).

  • Атрибуты хранились как "множества элементов данных". Каждому элементу данных (т.е. значению атрибута) присваивается уникальный ссылочный номер, а все ссылки к элементам данных внутри отношения осуществляют­ся через ссылочный номер. Алгоритм присвоения ссылочных номеров следующий: если а и Ь принадлежат одному и тому же множеству элементов данных, тогда ссылочный номер для а будет больше для Ь, если и только если а больше, чем Ь. Вследствие этого любая операция сравнения между двумя элементами данных (из того же самого множества элементов данных) может быть выполнена непосредственно на соответствующих ссылочных номерах; кроме того, само реальное сравнение, вероятно, более эффективно, поскольку ссылки имеют фиксированную длину, в то время как элементы данных могут иметь и переменную длину. Этот момент особенно важен с учетом того, что такие сравнения являются операциями, которые, наверняка, наиболее часто выполняются внутри этой системы (как, вероятно, и во всякой системе баз данных).

    1. Notley M.G. Peterlee IS/1 System // IBМ (UK) Scientific Centre Report UKSC-0018. - 1972.

См. комментарии к [6.8].

    1. Todd S.J.P. The Peterlee Relational Test Vehicle - А System Overview // IBM Sys. J. - 1976. -15, № 4.

Peterlee Relational Test Vehicle (PRTV) - это экспериментальная система, разработанная в научном центре IBM UK, Петерли, Англия. Она была разработана на основе более ранней системы IS/1 [6.7]. В ней поддерживались n-арные отношения и версия алгебры под названием ISBL (Information System Base Language - базовый язык информационных систем). Эта версия алгебры основывалась на предложениях, изложенных в [6.9]. Идеи, изложенные в этой главе относительно результирующих имен атрибутов и операторов, основанных на согласованных именах атрибутов, идут еще от алгебры ISBL и предложений статьи [6.9]. Система PRТV обладала тремя важными свойствами.

  • В ней были реализованы сложные методы преобразования выражений (это еще будет обсуждаться далее в этой книге).

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

  • Она обеспечивала "функцию расширяемости", т.е. возможность расширять систему, добавляя определенные пользователем вычислительные функции.

    1. Наll Р.А.V., Hitchcock Р., Todd S.J.P. Аn Algebra of Relations for Machine Computation // Conference Record of the 2nd АСМ Symposium оn Principles of Programming Languages. - Palo Alto, Calif., 1975.

    2. Furtado A.L., Kerschberg L. Аn Algebra of Quotient Relations // Proc. 1977 АСМ SIGMOD Intern. Conf. оn Management of Data. - Toronto, Canada, 1977.

Представлена пересмотренная версия реляционной алгебры для оперирования непосредственно с "относительными отношениями" ("quotient relations").

Дано отношение R, относительное отношение можно получить из отношения R путем группировки его кортежей на основе некоторого его атрибута (так же, как в операторе ву операции SUMMERIZE, описанной в этой главе). Например, относительное отношение, полученное из отношения поставщиков S на основе значений атрибута CITY - это множество из трех групп кортежей: в одной содержатся два кортежа поставщиков из Лондона, в другой - два кортежа поставщиков из Парижа, в третьей - один кортеж поставщика из Атена. Авторы утверждают, что работа непосредственно с такими относительными отношениями приводит к упрощению формулировок запросов и потенциально к более эффективной реализации системы.

    1. Merrett Т.Н. The Extended Relational Algebra, А Basis for Query Languages // В. Shneiderman (ed.). Databases: Improving Usability and Responsiveness. - New York, N.Y.: Academic Press, 1978.

Целью этой статьи является введение кванторов в алгебру - не просто исчисления кванторов существования и кванторов всеобщности (об этом в главе 7), а более общих кванторов "количество" и "соотношение". С помощью этих кванторов можно выразить такие условия, как "по крайней мере три", "не более половины", "нечетное число" и т.д.

    1. Наll Р.А.V. Relational Algebra, Logic and Functional Programming // Рrос. 1984 АСМ SIGMOD Intern. Conf. оn Management of Data. - Boston, Mass., 1984.

В статье представлена функциональная интерпретация реляционной алгебры с целью (как говорится в статье) изложить теоретические основы так называемых "языков четвертого поколения" (4GL) и интегрировать функциональные, логические и реляционные языки таким образом, чтобы они могли совместно использовать технологию реализации. Автор утверждает, что, хотя логическое программирование и базы данных уже на протяжении некоторого времени сближаются друг с другом, во время написания функциональных или аппликативных языков мало обращается внимания на требования баз данных или технологии. Поэтому статья главным образом вносит вклад в сближение между ними.

    1. КIug А. Equivalence of Relational Algebra and Relational Calculus Query Languages Having Aggregate Functions // JACM. - 1982. - 29, № 3.

В статье определяется множество расширений реляционной алгебры и реляционного исчисления для включения поддержки итоговых функций (для ал­гебры это нечто подобное оператору SUММARIZE, описанному выше в этой главе) и демонстрируется равносильность двух расширенных языков.

Ответы к некоторым упражнениям

  1. Операция соединения JOIN уже рассматривалась выше в этой главе. Операция пересечения INTERSECТ может быть определена так:

А INTERSECТ В = А МINUS (А МINUS В )

или

А INTERSECТ В = В МINUS МINUS А )

Эти два равносильных выражения хотя и допустимы, но несколько неудовлетворительны, поскольку А INTERSECТ В - симметричное выражение относительно А и В, а остальные два выражения не симметричны. А вот для сравнения симметричный вариант:

( А МINUS ( А МINUS В) ) UNION ( В МINUS ( В МINUS А) )

Замечание. Если дано, что отношения А и В совместимы по типу, то

А INTERSECТ В = А JOIN В

Теперь о делении. Пусть А, В, Х и У - обозначения, введенные нами при обсуждении операции DIVIDEВY выше в этой главе. Тогда

А DIVIDEВY В = А [ Х ] МINUS

( ( A [ X ] TIМESB) МINUS A ) [ Х ]

Отметим, что поскольку операцию JOIN можно определить в терминах операции TIМES и операция TIМES является частным случаем операции JOIN, то операцию JOIN можно рассматривать как примитивную вместо операции TIМES.

Отметим также, что, если разрешено использовать дополнения отношений, мы бы могли рассматривать операции UNION и INTERSECТ как примитивные и определить операцию МINUS через них. Обозначим NOT (R) как дополнение к отношению R, т.е. множество всех возможных кортежей, которые совместимы по типу с отношением R, но не принадлежат ему. Тогда:

А МINUS В = NOT ( (NOT ( А ) ) UNION ( А INTERSECТ В )

    1. А INTERSECТ: В (см. выше ответ к упр. 6.2).

  1. Мы даем только интуитивное "доказательство".

  • Произведение - это единственный оператор, увеличивающий количество атрибутов, а значит, его нельзя сымитировать любыми другими операторами. Поэтому произведение - примитивная операция.

  • Проекция - это единственный оператор, уменьшающий количество атрибутов, а значит, его нельзя сымитировать любыми другими операторами. Поэтому проекция - примитивная операция.

  • Объединение - единственный оператор, увеличивающий количество кортежей, кроме произведения, но произведение, кроме этого, также увеличивает количество атрибутов. Пусть отношения А и В должны быть объединены. Обратите внимание, что отношения А и В должны быть совместимы по типу и в их объединении должны быть те же самые атрибуты, что и в них самих. Если мы образуем проuзведенuе отношений А и В, а затем используем проекцию, чтобы уменьшить множество атрибутов в произведении до множества атрибутов в отношении А (или В), мы просто снова вернемся к исходному отношению А (или В). Следовательно, произведение не может быть использовано для моделирования операции объединения, а значит, операция объединения примитивна.

  • Вычитание не может быть смоделировано через произведение (поскольку операция произведения увеличивает количество кортежей), через объединение (аналогично) или через проекцию (поскольку проекция сокращает количество атрибутов). Также оно не может быть смоделировано с помощью выборки, поскольку вычитание реагирует на значения во втором отношении, которого не может быть при выборке (в силу природы условия выборки). Следовательно, операция вычитания также примитивна.

  • Выборка является единственной операцией, которая позволяет сравнивать значения атрибутов с определенными литералами (т.е. значениями, которые не являются частью какого-либо отношения). Следовательно, операция выборки также примитивна.

  1. Не совсем. Оператор DIVIDEBY, возможно, больше похож на целочисленное деление в обычной арифметике (т.е. он игнорирует остаток). Пусть заданы два отношения А и В, тогда формирование декартова произведения отношений А и В и затем деления результата отношением В даст нам снова отношение А:

( А TIМES В ) DIVIDEВY В = А

Однако деление отношения А отношением В и затем формирование декартова произведения результата с отношением В даст отношение, которое может быть идентично отношению А, но более вероятно, что оно будет некоторым собственным подмножеством отношения А:

( А DIVIDEВY В ) TIМES В = А

Давайте условимся последнее обстоятельство в данный момент считать "псевдообратным свойством". Тогда можно сказать, что результат деления отношения А отношением В является таким максимальным подмножеством проекции А[Х] (где Х - это множество общих атрибутов в отношениях А и В), что сохраняется псевдообратное свойство.

Отметим, что аналогичное свойство не сохраняется для операции DIVIDEBY PER, описанной в [6.4].

  1. Ловушка заключается в том, что операция JOIN использует атрибуты CIТY так же, как и атрибуты S# и Р# (в силу нашего определения оператора JOIN). Результат будет подобен следующему:

S#

SNANE

STATUS

CITY

P#

QTY

PNAME

COLOR

WEIGHT

S1

S1

S1

S2

S3

S4

Smith

Smith

Smith

Jones

Black

Clark

20

20

20

10

30

20

London

London

London

Paris

Paris

London

P1

P4

P6

P2

P2

P4

300

200

100

400

200

200

Nut

Screw

Cog

Bolt

Bolt

Screw

Red

Red

Red

Green

Green

Red

12

14

19

17

17

14

  1. . 2n. Это количество включает идентичную проекцию (т.е. проекцию по всем n атрибутам, которая дает результат, идентичный исходному отношению А) и "нулевую" проекцию (т.е. проекцию по никаким атрибутам совсем, которая дает в результате TABLE_DUM, если исходное отношение А пустое, и TABLE_DEE в противном случае).

  1. .Да, есть такое отношение, а именно TABLE_DEE. Отношение TABLE_DEE (далее для краткости D ЕЕ) - аналог номер один по отношению к умножению в обычной арифметике, поскольку

R TIМES DEE = DEE TIМES R = R

для всех отношений R. Иначе говоря, DEE - это нейтральный элемент для операции ТIМES (и конечно, для операции JOIN).

  1. Не существует отношения, ведущего себя относительно операции TIМES в точности аналогично нулю относительно умножения. Однако поведение отношения TABLE_DUM (или сокращенно DUM) несколько сходно с поведением нуля, так как для всех отношений R

R TIМES DUM = DUM TIМES R = пустое отношение с тем же

самым заголовком, что и у R

  1. Отношениями, которые совместимы с DEE и DUM при объединении, пересечении и вычитании, являются сами отношения DEE и DUM. В результате мы имеем:

UNION

DEE

DUM

INTERSECT

DEE

DUM

MINUS

DEE

DUM

DEE

DEE

DEE

DEE

DEE

DUM

DEE

DUM

DEE

DUM

DEE

DUM

DUM

DUM

DUM

DUM

DUM

DUM

В случае вычитания первый операнд показан слева в таблице, а второй вверху таблицы (для других операторов, конечно, операнды могут меняться между собой). Обратите внимание, как это напоминает таблицы истинности для логических операций ИЛИ, И, И НЕ соответственно; конечно, такое совпадение не случайно.

Рассмотрев затем выборку и проекцию, мы получим:

  • Любая выборка из отношения DEE дает отношение DEE, если значение условия выборки равно истине, и DUM, если оно равно лжи.

  • Любая выборка из отношения DUM дает отношение DUM.

  • Проекция любого отношения по пустому множеству атрибутов дает отношение DUM, если исходное отношение пустое, и отношение DЕЕ в противном случае. В частности, проекция отношения DЕЕ или отношения DUM, обязательно по пустому множеству атрибутов, возвращает исходное отношение.

В следующих замечаниях по делению подразумевается обобщенная форма оператора деления Тодда, которая рассматривается в [6.4].

  • Любое отношение R, делимое отношением DЕЕ, в результате дает отношение R. Любое отношение R, делимое отношением DUM, в результате дает пустое отношение с тем же заголовком, что и у отношения R.

  • Отношение DЕЕ, делимое любым отношением R, в результате дает отношение R.

  • Отношение DUM, делимое любым отношением R, в результате дает пустое отношение с тем же заголовком, что и у отношения R.

  • Любое непустое отношение, делимое на себя, в результате дает отношение DЕЕ. Пустое отношение, делимое на себя, в результате дает отношение DUM.

Операции расширения и суммирования:

  • Расширение отношения DЕЕ или отношения DUM для добавления новых атрибутов дает отношение с одним атрибутом и тем же количеством кортежей, что и в исходном отношении.

  • Суммирование отношения DEE или отношения DUM (обязательно по пустому множеству атрибутов) дает отношение с одним атрибутом и тем же количеством кортежей, что и в исходном отношении.

  1. Здесь мы имеем дело, конечно, с "независимыми от времени" потенциальными ключами. Имея в виду это предостережение, мы предлагаем в качестве "первого эскиза" множества ответов следующее:

а) любая выборка из отношения А наследует все потенциальные ключи отношения А;

б) если проекция включает любой из потенциальных ключей K отношения А, то К - потенциальный ключ проекции. В противном случае потенциальным ключом является комбинация всех атрибутов проекции;

в) каждая комбинация К потенциального ключа КА отношения А и потенциального ключа КВ отношения В является потенциальным ключом произведения А TlМES B;

г) потенциальным ключом объединения А UNION В является комбинация всех атрибутов;

д) оставлено в качестве упражнения для читателя (пересечение - не примитивная операция);

е) каждый потенциальный ключ отношения А является потенциальным ключом для результата вычитания А МINUS B;

ж) мы оставляем общий случай в качестве упражнения для читателя (естественное соединение - не примитивная операция). Однако заметим, что в частном случае, где соединяющий атрибут в отношении А является потенциальным ключом А, каждый потенциальный ключ отношения В является потенциальным ключом соединения;

з) оставлено в качестве упражнения для читателя (деление - не примитивная операция);

и) каждый потенциальный ключ отношения А является и потенциальным ключом для произвольного расширения А;

к) потенциальным ключом для операции подведения итогов отношения А является множество атрибутов, определенных в операторе ву.

Однако большинство упомянутых операторов в определенных ситуациях можно некоторым образом усовершенствовать. Например:

  • Сочетание атрибутов {S#, Р#, J#} не является потенциальным ключом для выборки SPJ WНERE S# = 'S1'; им является сочетание {Р#, J#}.

  • Е сли отношение А, имеющее заголовок {Х, У, Z} и единственный потенциальный ключ Х, удовлетворяет "функциональной зависимости" У Z (эти обозначения описываются в главе 9), то У является потенциальным ключом проекции отношения А по атрибутам У и Z.

  • Если отношение А и отношение В оба являются выборкой из отношения С то каждый потенциальный ключ отношения С является потенциальным ключом объединения А UNION B

И т.д. Более подробно вопрос о наследовании потенциальных ключей обсуждается далее в книге.

  1. Нет!

  1. J

  1. J WНERE CIТY = 'London'

  1. ( SPJ WНERE J# = 'J1' ) [ S# ]

  1. SPJ WНERE QTY ≥ 300 AND QTY ≤ 750

  1. Р [ COLOR, CIТY ]

  1. ( S JOIN Р JOIN J) [ S#, Р#, J# ]

  1. ( ( ( S RENAМE CIТY AS SCIТY ) TIМES

( Р RENAМE CIТY AS PCIТY ) TIМES

( J RENAМE CIТY AS JCIТY ) )

WНERE SCIТY ≠ PCIТY

OR PCIТY ≠ JCIТY

OR JCIТY ≠ SCIТY) [ S#, Р#, J# ]

  1. ( ( ( S RENAМE CIТY AS SCIТY ) TIМES

( Р RENAМE CIТY AS PCIТY ) TIМES

( J RENAМE CIТY AS JCITY ) )

WНERE SCIТY ≠ PCIТY

AND PCIТY ≠ JCIТY

AND JCIТY ≠ SCIТY ) [ S#, Р#, J# ]

  1. ( SPJ JOIN ( S WНERE CIТY = 'London' ) ) [ Р# ]

  1. ( ( SPJ JOIN (S WHERE CIТY = 'London' ) ) [Р#, J#]

JOIN ( J WНERE CIТY = 'London' ) ) [ Р# ]

  1. ( ( S RENAМE CIТY AS SCIТY ) JOIN SPJ JOIN

( J RENAМE CIТY AS JCIТY) ) [SCIТY, JCIТY ]

    1. ( J JOIN SPJ JOIN S ) [Р# ]

  1. ( ( ( J RENAМE CIТY AS JCIТY ) JOIN SPJ JOIN

( S RENAМE CIТY AS SCIТY )

WНERE JCIТY ≠ SCIТY ) [ J# ]

    1. ( ( ( SPJ [ S#, Р# ] RENAМE S# AS ХS#, Р# AS ХР# ) )

TIМE

( (SPJ [ S#, Р# ] RENAМE S# AS УS#, Р# AS УР# ) ) )

WНERE ХS# = УS#

AND ХР# < УР# ) [ХР#, УР# ]

  1. ( SUMMARIZE ( ( SPJ WНERE S# = 'S1' ) [ J#] ) ВУ ()

ADD COUNT AS N) [N ]

Как уже отмечалось, это выражение, к сожалению, не будет возвращать нуль (точнее, отношение из одного атрибута и одного кортежа, содержащего числовое значение нуль), если поставщик S1 не обеспечивает проектов; вместо этого выражение возвратит пустое отношение. Поэтому мы предлагаем следующее более точное решение:

( EXТEND ( S WНERE S# = 'S1' )

ADD COUNТ ( ( МATCHING SPJ) ( P# ] ) AS N ) [ N ]

  1. (SUMMARIZE ( SPJ WНERE S# = 'S1' AND Р# = 'Р1') ) ВУ ()

ADD SUМ (QTY) AS Q) [Q]

Следующее решение более точное (почему?). Обратите внимание на синтаксис apгументa SUM.

( EXТEND ( S WНERE S# = 'S1' )

ADD SUМ ( ( МATCНING SPJ ) WНERE Р# = 'Р1', QTY )

AS Q) [Q]

  1. SUMMARIZE SPJ ВУ ( Р#, J# ) ADD SUМ ( QTY ) AS Q

  1. ( (SUMMARIZE SPJ ВУ ( P#, J# )

ADD AVG ( QTY ) AS Q )

WНERE Q > 320 ) [ P# ]

  1. ( J JOIN ( SPJ WНERE S# = 'S1' ) ) [ JNAМE ]

  1. ( Р JOIN ( SPJ WНERE S# = 'S1' ) ) [COLOR]

  1. ( SPJ JOIN ( J WНERE CIТY = 'London' ) ) [ P# ]

  1. ( SPJ JOIN ( SPJ WНERE S# = 'S1' ) [ Р# ] ) [ J# ]

  1. ( ( ( SPJ JOIN ( Р WНERE COLOR = 'Red' ) ( P# ] )

[ S# ] JOIN SPJ) [ P# ] JOIN SPJ) [S# ]

  1. ( ( S [ S#, STAТUS ] RENAМE S# AS XS#, SТAТUS AS XSТAТUS )

TIМES

( S ( S#, STAТUS ] RENAМE S# AS УS#, STAТUS AS YSTAТUS )

WНERE ХS# = 'S1' AND XSТAТUS > YSTAТUS ) [УS# ]

  1. J [ J#I ] МINUS

( ( J [ J#, CIТY ] RENAМE CIТY AS XCIТY )

TIМES J [ CIТY ] ) WНERE XCIТY > CIТY ) [ J# ]

  1. ( ( (SUMMARIZE ( SPJ WНERE Р# = 'Р1' ) ВУ ( J# )

ADD AVG ( QTY ) AS QX

TIМES

(SUMMARIZE ( SPJ WНERE J# = 'J1' ) ВУ ( )

ADD МАХ (QTY) AS QY) [QY] )

WНERE OX> QY ) [ J# ]

Замечание. В предыдущем выражении не учитывается должным образом случай, когда для проекта J1 нет поставок. Поэтому следующее решение предпочтительнее предыдущего:

( EXТEND ( SPJ WНERE Р# = 'Р1' )

ADD AVG ( ( SPJ RENAМE J# AS ZJ# )

WНERE ZJ# = J# AND РО = 'Р1', QTY ) AS QX )

[ J#, QX ]

TIМES

( EXTEND ( SPJ WНERE J# = 'J1' )

ADD МАХ ( ( SPJ, WНERE J# = 'J1', QTY ) AS QY ) [ QY ] )

WНERE QX > QY [ J# ]

  1. ( ( ( ( ( SPJ WНERE Р# = 'Р1.' ) [ S#, J#, QTY ] )

RENAМE J# AS XJ#, QTY AS ХQ )

TIMES

( SUMMARIZE ( SPJ WНERE Р# = 'Р1' ) ВУ ( J# )

ADD AVG ( QTY ) AS Q ) )

WНERE XJ# = J# AND ХQ > Q) [ S# ]

  1. J [ J# J МINUS

( ( S WНERE CIТY = ‘London’ ) [ S# ]

JOIN SPJ JOIN ( Р WНERE COLOR = 'Red' ) ) [ J# ]

  1. J [ J# ] МINUS ( SPJ WНERE S# '" 'S1' ) [ J# ]

  1. ( Р WНERE ( МAТCНING SPJ) [ J# ] ≥

( J WНERE CIТY = 'London' ) [ J# ] ) [ Р# ]

  1. ( SPJ [ S#, Р#, J# ] DIVIDEВY J [ J# ] ) [ S# ]

Замечание. В этом решении предполагается, что отношение SPJ не пустое.

  1. ( J WНERE ( МAТCНING SPJ) [ Р# ] ≥

  1. S [ CIТY ] UNlON Р [ CIТY ] UNION J [ CIТY ]

  1. ( SPJ JOIN ( S WНERE CIТY = 'London’ ) ) [ Р#]

UNlON

SPJ JOIN ( J WНERE CIТY = 'London' ) ) [ Р# ]

  1. ( S TIМES Р ) [ S#, Р# ] МINUS SР. [ S#, Р# ]

  1. Мы приводим два решения этой проблемы. Первое, предложенное Хугом Дарвеном (Hugh Darwen), для простоты приводится в пошаговой форме с комментариями.

Т1 := ( SР RENAМE S# AS SA) [ SA, P# ] ;

/* Т1 {SA, Р#} ; пocтaвщик SA поставляет деталь Р# *

Т2 := ( SР RENAМE S# AS SB) [ SB, Р# ] ;

/* T2 {SB,Р#} ; пocтaвщик SB поставляет деталь Р# */

T3 := Т1 [ SA ]

/* T3 {SA} : поставщик SA поставляет некоторую деталь */

Т4 := Т1 [ SВ ]

/* Т4 {SВ} : поставщик SB поставляет некоторую деталь */

Т5 := T1 TIМES Т4

/* Т5 {SA,SB,P#} ; поставщик SA поставляет некоторую деталь

и поставщик SB поставляет деталь Р# * /

T6 : = T2 TIMES T3

/* Т6 {SА,SВ,Р#} ; поставщик SB поставляет некоторую деталь

и поставщик SА поставляет деталь Р# * /

T7 : = T1 JOIN T2

/* Т7 {SA,SB,P#} : поставщики SB и SА поставляют деталь Р# */

T8 : = T3 TIMES T4

/* Т8 {SA,SВ} : поставщик SB поставляет некоторую деталь

и поставщик SА поставляет некоторую деталь .*/

Т9 := SР [ Р# ] ;

/* Т9 {Р#} : деталь P # поставляется некоторым поставщиком */

T10 := Т8 TlМES Т9

/* T10 {SA, SB, P#} :

поставщик SA поставляет некоторую деталь,

поставщик SB поставляет некоторую деталь

и деталь P# поставляется некоторым поставщиком */

T11 : = T10 MINUS T7

/* T11 {SA, SB, P#} : деталь Р# поставляется,

но не поставщиками SA и SB одновременно */

T12 := T6 INTERSECT T11

/* T12 {SA, SB, P#} : деталь P# поставляется поставщиком SA,

но не поставляется поставщиком SB */

T13 := T5 INTERSECT T11

/* T13 {SA, SB, P#} : деталь P# поставляется поставщиком SB,

но не поставляется поставщиком SA */

T14 :=T12 [ SA, SB ] ;

/*T14 { SA, SB } :

поставщик SA поставляет некоторую деталь, не поставляемую поставщиком SB */

T15 :=T13 [ SA, SB ] ;

/*T15 { SA, SB } :

поставщик SB поставляет некоторую деталь, не поставляемую поставщиком SА */

T16 := T14 UNION T15 ;

/*T15 { SA, SB } : некоторая деталь поставляется поставщиком SA или поставщиком SB, но не обоими одновременно */

T17 := T7 [ SA, SB] ;

/*T17 { SA, SB } :

некоторую деталь поставляют одновременно поставщики SA и SB */

T18 : = T17 MINUS T16 ;

/* T18 { SA, SB } :

некоторую деталь поставляют одновременно поставщики SA и SB,

и нет деталей, поставляемых SA и не поставляемых SB,

и нет деталей, поставляемых SB и не поставляемых SA

- значит, поставщики SA и SB поставляют одни и те же детали */

T19 : = T18 WHERE SA < SB ;

/* приводим отношение в порядок */

Во втором решении (которое значительно проще!) используются реляционные сравнения. Обозначим через RA отношение S, в котором атрибут S# переименован в атрибут SA, а затем взята проекция по этому атрибуту, аналогично определено отношение RВ. Тогда требуемый результат можно получить с помощью следующего выражения:

1Изначально эта операция называлась restrict (дословно – ограничение), но теперь ее чаще называют select (выборка). Однако это последнее название не совсем удачное, поскольку его легко перепутать с оператором SELECT в SQL, а это далеко не то же самое. На самом деле оператор SELECT в SQL гораздо мощнее алгебраической операции restrict – он в основном включает функциональные возможности всех первоначальных восьми алгебраических операций и еще кое-что.

1 В предыдущих изданиях этой книги, придерживаясь терминологии [6.2], для этого понятия использовался термин union-compatible (дословно-совместимый для объединения), который часто встречается в литературе. Причины, побудившие нас предпочесть термин type-compatible (совместимо по типу), разъясняются далее в этой книги, где также исследуется определение этого термина (и связанное с этим ослабление довольно строгих терминов для операций объединения, пересечения и вычитания).

1 Необходимо подчеркнуть, что замена Х и У литералами в действительности просто другая синтаксически сокращенная запись. Например, выборку S WHERE CITY=’London’ можно считать сокращением выражения следующего вида: (EXTEND S ADD ’London’ AS LONDON) WHERE CITY =- LONDON. (См. обсуждение оператора EXTEND далее в этой главе.)

1 Но не совсем. В системе, которая поддерживает логические типы данных, «простые сравнения» могут также содержать имя атрибута или литерал этого типа данных.

1 В системе должен быть определен домен атрибута Z. Обсуждение этого вопроса (и многих связанных с ним) будет продолжено далее в этой книге.

1 В действительности в предыдущем издании этой книги (как и в языке SQL – см. главу 8) использовалось ключевое слово GROUPBY вместо BY, но слово GROUPBY имеет несколько процедурный подтекст, и в любом случае слово BY короче.

2 Как и в случае с оператором EXTEND, в системе должен быть определен домен для нового атрибута Z. И опять обсуждение этого вопроса (и многих связанных с ним) будет продолжено далее в этой книге.

1 Как неоднократно упоминалось в этой главе, данная операция также служит основой для операций выборки (т. е. запросов).

1 Однако обратите внимание, что новые условия не являются условиями выборки в терминах определения, данного выше в этой главе. На самом деле наши объяснения умышленно упрощены. В действительности необходимо сделать следующее. Вначале нужно сделать допустимым атрибуты, значения которых являются отношениями (и это нужно сделать без нарушения требований нормализации!). Далее необходимо усовершенствовать оператор EXTEND так, чтобы он мог генерировать такие атрибуты. После этого можно использовать эти атрибуты для сравнения при выборке обычным образом. Более подробно этот вопрос будет обсуждаться в последующих главах книги.