Скачиваний:
180
Добавлен:
02.05.2014
Размер:
2.66 Mб
Скачать

6.10. Резюме

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

Начальный вариант реляционной алгебры определяет восемь операторов: традицион- ный набор операторов обработки множеств (объединение, пересечение, вычитание и произведение, причем каждая из этих операций была некоторым образом модифициро- вана, поскольку реляционные операторы применимы не к произвольным множествам, а к отношениям специального вида) и набор специальных реляционных операторов (выборки, проекции, соединения и деления). К этому изначальному набору операто- ров мы добавили операторы RENAME (переименование), SEMIJ0IN (полусоединение), SEMIMINUS (полувычитание), EXTEND (расширение) и SUMMARIZE (обобщение). Также бы- ли рассмотрены оператор TCL0SE (транзитивное замыкание) и вкратце— операторы GROUP (группирование) и UNGR0UP (разгруппирование). Некоторые из них требуют, что- бы два отношения были совместимы по типу (ранее такие отношения назывались "совместимыми для объединения"). Здесь же подчеркивалось, что не все упомянутые выше операторы примитивны (одни из них можно определить посредством других). Далее было показано, как эти операторы можно комбинировать в выражения, исполь- зуемые для различных целей: выполнения выборки, обновления и других операций. Также кратко обсуждалась идея преобразования записываемых выражений для их оп- тимизации (подробнее эта идея будет обсуждаться в главе 17). Дополнительно рассмат- ривалась возможность пошагового подхода при построении сложных запросов с ис- пользованием предложения WITH, позволяющего ввести новые имена для отдельных вы- ражений. И наконец, обсуждалась идея реляционных сравнений, которые часто упро- щают формулирование запросов (например, таких, которые в противном случае требовали бы использования оператора DIVIDEBY).

Упражнения

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

  2. В предложенном Коддом первоначальном наборе из восьми операций пять (объединение, вычитание, произведение, выборка и проекция) можно рассматривать как примитивные. Дайте определение операций естественного соединения, пересече- ния и (что значительно сложнее) деления в терминах этих примитивных операций.

  3. Рассмотрим выражение A JOIN В. Если заголовки отношений А и В не пересекают- ся (т.е. в заголовках нет общих атрибутов), то это выражение эквивалентно выра- жению A TIMES В. А какому выражению оно будет эквивалентно, если заголовки отношений будут одинаковы?

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

  1. В обычной арифметике умножение и деление — взаимообратные операции. Явля- ются ли взаимообратными операции TIMES и DIVIDEBY в реляционной алгебре?

  2. Пусть дана обычная база данных поставщиков и деталей. Чему в этом случае будет равно выражение S JOIN SP JOIN Р? (Предостережение. Здесь есть ловушка!)

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

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

n*l = l*n = n

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

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

п*0 = 0*п = 0

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

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

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

  3. Операции объединения, пересечения, произведения и соединения были определены как бинарные операции (т.е. действующие на двух операндах). Тем не менее в этой главе мы показали, как их можно расширить до n-арных для любого п>1. Таким обра- зом, выражение A UNION В UNION С можно однозначно назвать тройным объедине- нием отношений А, В и С. А что можно сказать в случае, когда п=1 или п=0 ?

Упражнения по составлению запросов

В основу всех остальных упражнений положена база данных поставщиков, деталей и проектов (см. рис. 4.5 в главе 4 и ответ к упр. 5.4 в главе 5). В каждом упражнении вам предлагается по словесному описанию запроса составить соответствующее ал- гебраическое выражение. (В качестве интересной вариации можно предложить пред- варительно обратиться к ответам к некоторым упражнениям и попытаться составить по ним словесное описание задания соответствующих упражнений.) Для удобства ниже повторно приводится (в общих чертах) структура используемой базы данных.

s

р

{ Si, SNAME, STATUS, CITY } PRIMARY KEY { SI } { Pi, PNAME, COLOR, WEIGHT, CITY } PRIMARY KEY { Pi }

J { J#, JNAME, CITY }

PRIMARY KEY { J# } SPJ { Si, Pi, Ji, QTY }

PRIMARY KEY { Si, Pi, Ji }

FOREIGN KEY { Si } REFERENCES S

FOREIGN KEY { Pi } REFERENCES P

FOREIGN KEY { Ji } REFERENCES J

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

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

  3. Выбрать номера поставщиков деталей для проекта с номером 'Л'.

  4. Выбрать все поставки, в которых количество деталей находится в диапазоне от 300 до 750 штук включительно.

  5. Найти все существующие сочетания вида "цвет детали— город, из которого по- ставляются детали".

Замечание. Здесь и в последующих упражнениях слово "все" используется в значе- нии "все, представленные в настоящий момент в базе данных", а не "все возможные".

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

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

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

  4. Выбрать номера деталей, поставляемых поставщиком в Лондоне.

  5. Выбрать номера деталей, поставляемых поставщиком в Лондоне для проекта в Лондоне.

  6. Найти все пары названий городов, для которых поставщик из первого города по- ставляет детали для проекта во втором городе.

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

  8. Найти все номера проектов, детали для которых поставляются по крайней мере одним поставщиком не из того же города.

  9. Выбрать все пары номеров деталей, в которых обе детали поставляются одним и тем же поставщиком.

  10. Определить общее число проектов, детали для которых поставляются поставщи- ком с номером ' S1'.

  11. Определить общее количество деталей с номером 'Р1', поставляемых поставщи- ком с номером 'SI'.

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

  13. Выбрать номера деталей, поставляемых для некоторого проекта, со средним коли- чеством, составляющим более 350 штук.

  1. Выбрать названия проектов, детали для которых поставляются поставщиком с но- мером 'S3.'.

  2. Определить цвета деталей, поставляемых поставщиком с номером ' S1'.

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

  2. Выбрать номера проектов, в которых используется по крайней мере одна деталь, имеющаяся у поставщика с номером 'S1'.

  3. Определить номера поставщиков по крайней мере одной детали, поставляемой по крайней мере одним поставщиком, который поставляет по крайней мере одну красную деталь.

  4. Выбрать номера поставщиков со статусом, меньшим, чем статус поставщика с но- мером 'S1'.

  5. Определить номера проектов, находящихся в городе, который указан первым в ал- фавитном списке городов.

  6. Выбрать номера проектов, для которых среднее количество поставляемых деталей с номером 'Р1' больше, чем наибольшее количество любых деталей, поставляе- мых для проекта с номером ' Л'.

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

  8. Найти номера проектов, для которых поставщиками из Лондона не поставляются красные детали.

  9. Определить номера проектов, детали для которых полностью поставляются по- ставщиком с номером 'S1'.

  10. Определить номера деталей, поставляемых для лондонских проектов.

  11. Установить номера поставщиков одной и той же детали для всех проектов.

  12. Выбрать номера проектов, в состав которых входят как минимум все типы деталей, поставляемые поставщиком с номером 'S1'.

  13. Установить все города, в которых находится по крайней мере один поставщик, од- на деталь или один проект.

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

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

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

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

  18. Получить "разгруппированную" версию отношения из предыдущего упражнения.

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

6.1. Codd. E.F. Relational Completeness of Data Base Sublanguages in Randall J. Rustin (ed.) // Data Base Systems, Courant Computer Science Symposia Series 6. — Englewood Cliffs, N.J.: Prentice-Hall, 1972.

В этой статье Кодд впервые дает формальное определение операторов исходной версии реляционной алгебры (определения операторов приводились также в [5.5], однако они были неполными и менее формальными).

Эта статья обладает одним недостатком. В ней "для удобства объяснения" предпо- лагается, что атрибуты отношений упорядочены слева направо и, следовательно, могут быть идентифицированы по своему порядковому номеру. (Тем не менее Кодд говорит, что на практике лучше использовать имена, а не порядковые номе- ра. То же самое он говорил в [5.1].) В этой статье ничего не сказано об операторе RENAME и не рассмотрен вопрос о наследовании типа результата. Возможно, вслед- ствие этих упущений те же критические замечания применимы сегодня ко многим рассуждениям в литературе по реляционной алгебре, к SQL-продуктам и (в мень- шей степени) к стандартам языка SQL.

Другие комментарии к этой статье можно найти в главе 7, в частности в разделе 7.4. Замечание. В [3.3] описана так называемая алгебра А с "сокращенным набором инст- рукций", которая позволяет систематически определять более сложные операторы в виде определенной комбинации небольшого числа примитивных операторов. Фактиче- ски в [3.3] показано, что вся функциональность оригинальной алгебры Кодда может быть получена с помощью всего лишь двух примитивных операторов — remove и nor.

6.2. Darven Н. (writing as Andrew Warden). Adventures in Relationland // Date CJ. Rela- tional Database Writings 1985-1989. — Reading, Mass.: Addison-Wesley, 1990.

Это серия коротких статей, в которых в оригинальном, развлекательном и инфор- мативном стиле исследуются различные стороны реляционной модели и реляци- онных СУБД. Ниже перечислены названия этих статей.

  1. The Naming of Columns (Наименования столбцов)

  2. In Praise of Marriage (О пользе супружества)

  3. The Keys of the Kingdom (Ключи от королевства)

  4. Chivalry (Рыцарство)

  5. A Constant Friend (Верный друг)

  6. TableDee and TableDum (Таблица_ЧеРт0Вка и ТаблицаПустышка)

  7. Into the Unknown (В неведомое)

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

В данной статье анализируется оригинальный оператор деления, определенный Коддом в [6.1], а также обобщение этого оператора, сделанное Холлом (Hall), Хитчкоком (Hitchcock) и Тоддом (Todd) [6.10], которое в отличие от определенно- го Коддом оригинального оператора деления позволяет делить любые отношения на любые другие отношения. (Оригинальный оператор деления Кодда был опреде- лен только для таких делимых и делителей, заголовок делителя которых является подмножеством заголовка делимого.) В этой статье описаны трудности, возни-

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

Замечание. Как видно из синтаксиса языка Tutorial D, эти два оператора различны. В частности, оператор Great Divide представляет собой (к сожалению) не вполне со- вместимое сверху вниз расширение оператора Small Divide. В данной статье также предлагается не называть переделанные операторы "делением" (см. упр. 6.5). Для дальнейших ссылок приведем определение оригинального оператора деления Кодда. Пусть даны отношения А и В с заголовками {X,Y} и {Y} соответственно. (X и Y могут быть составными.) Тогда результатом вычисления выражения A DIVIDEBY В будет отношение с заголовком {X} и телом, состоящим из всех кортежей {Х:х}, та- ких, что кортеж {Х:х, Y;y} содержится в теле отношения А для всех кортежей {Y:y}, содержащихся в отношении В. Другими словами, результат состоит из тех значений атрибута X из отношения А, для которых соответствующие значения атрибута Y (в от- ношении А) содержат все значения атрибута Y в отношении В.

6.4. C.J. Date. Quota Queries (в трех частях) // Date C.J., Darven Н., and McGoveran D. Relational Database Writings 1994-1997. — Reading, Mass.: Addison-Wesley, 1998. Квота-запрос — это запрос, в котором указывается желаемый предел для кардиналь- ности результирующего отношения. Например, это может быть запрос "Найти три са- мые тяжелые детали". На языке Tutorial D его можно записать следующим образом.

Р QUOTA ( 3, DESC WEIGHT )

Это выражение является сокращенной записью следующего оператора. ( ( EXTEND Р

ADD COUNT ( ( Р RENAME WEIGHT AS WT ) WHERE WT > WEIGHT ) AS t_HEAVIER ) WHERE t_HEAVIER < 3 ) { ALL BUT #_HEAVIER }

(Здесь имена WT и t_HEAVIER могут быть произвольными.) Если взять за основу наши обычные данные, то результат будет состоять из деталей с номерами 'Р2', 'РЗ' и 'Р6'.

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

6.5. Carey M.J. and Kossmann D. On Saying 'Enough Already' in SQL // Proc. 1997 Int. Conf. On Management of Data. — Tucson, Ariz., May, 1997.

Еще одна работа, посвященная квота-запросам. В отличие от [6.4], здесь основное внимание уделяется вопросам реализации, а не моделирования. Запрос "Найти три самые тяжелые детали" в контексте этой статьи будет выглядеть так.

SELECT * FROM Р

ORDER BY WEIGHT DESC STOP AFTER 3;

Проблема подобного подхода состоит в том, что операция STOP AFTER применяется к результату выполнения оператора ORDER BY, который (как видно из раздела "Свойства отношений" главы 5) является не отношением, а массивом или списком. Следователь- но, окончательный результат, по-видимому, также не будет отношением, а значит, бу- дет нарушено свойство замкнутости. Этот вопрос в данной статье не обсуждается. Разумеется, полученный результат можно снова преобразовать в отношение, но тогда мы столкнемся с еще одной проблемой, поскольку результат выполнения оператора STOP AFTER в общем случае непредсказуем. Например, если взять за основу наши обычные данные и в предыдущем SQL-запросе заменить строку STOP AFTER 3 стро- кой STOP AFTER 2, то результат выполнения этого запроса будет неопределенным. Оператор STOP AFTER был реализован в исследовательском прототипе компании IBM и, таким образом, может получить распространение в продуктах IBM, а затем попасть в стандарт языка SQL (мы надеемся, что не раньше, чем будут решены указанные выше проблемы).

6.6. Goldstein R.C. and Strnad A.J. The MacAIMS Data Management System // Proc. 1970 ACM SICFIDET Workshop on Data Description and Access. — November, 1970.

См. аннотацию к [6.7].

6.7. Strnad A.J. The Relational Approach to the Management of Data Bases // Proc. IFIP Congress. — Ljubljana, Yugoslavia. — August, 1971.

Мы упоминаем систему MacAIMS [6.6], [6.7], в основном, ради исторического ин- тереса. Она является наиболее ранним примером системы, поддерживающей п- арные отношения и алгебраический язык. Интересным также является то, что эта система разрабатывалась параллельно (и, по меньшей мере, частично независимо) с работой Кодда над реляционной моделью. Однако, в отличие от работы Кодда, система MacAIMS не получила существенного развития в будущем.

6.8. Notley M.G. The Peterlee IS/1 System // IBM UK Scientific Centre Report UKSC- 0018.—-March, 1972.

См. аннотацию к [6.9].

6.9. Todd S.J.P. The Peterlee Relational Test Vehicle —A System Overview // IBM Sys. J. — 1976. — 15, №4.

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

  • Поддерживала операторы RENAME, EXTEND и SUMMARIZE

  • Включала в себя сложные средства для преобразования выражений (глава 17)

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

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

  1. Hall P.A.V., Hitchcock P., and Todd S.J.P. An Algebra of Relations for Machine Computation // Conf. Record of the 2nd ACM Symposium on Principles of Programming Languages. — Palo Alto, Calif. — January, 1975.

  2. Hall P.A.V. Relational Algebra, Logic and Functional Programming // Proc. 1984 ACM SIGMOD Int. Conf. on Management of Data. — Boston, Mass. — June, 1984.

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

6.12. Klug A. Equivalence of Relational Algebra and Relational Calculus Query Languages Having Aggregate Functions // JACM 29. — July, 1982. — №3.

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

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

Замечание. Ответы к упр. 6.13-6.50 не являются единственно возможными.

6.2. Операция соединения JOIN уже рассматривалась в разделе 6.4. Операция пересече- ния INTERSECT может быть определена одним из двух представленных ниже экви- валентных вариантов.

A INTERSECT В = A MINUS (A MINUS В ) A INTERSECT В = В MINUS (В MINUS А )

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

( A MINUS ( A MINUS В ) ) UNION ( В MINUS ( В MINUS А ) )

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

A INTERSECT В s A JOIN В

Теперь о делении. Можно записать следующее.

A DIVIDEBY В PER С = А { X }

MINDS ( ( А { X } TIMES В { Y } )

MINUS С { X, Y } ) { X }

Здесь X — множество атрибутов, общих для отношений А и С, a Y — множество ат- рибутов, общих для отношений В и С.

Замечание. Определенный таким образом оператор DIVIDEBY является обобщением оператора деления, рассмотренного ранее в этой главе, но все еще не оператором Small Divide [6.3] ввиду предположения о том, что отношение А не содержит атрибу- тов, отличных от атрибутов X, отношение В не содержит атрибутов, отличных от Y, и отношение С не имеет атрибутов, отличных от атрибутов X и Y. Приведенное выше обобщение позволяет записать запрос "Получить номера поставщиков всех деталей" в более простой форме S DIVIDEBY Р PER SP вместо развернутой формулировки.

S { Si } DIVIDEBY Р { Pi } PER SP { Si, Pi }

6.3. A INTERSECT В (см. ответ к упр. 6.2).

Замечание. Поскольку операция произведения является специальным случаем опе- рации соединения, в роли примитивного оператора вместо TIMES может выступать оператор JOIN, тем более что он является более общим.

6.4. Здесь мы даем только неформальное (очень неформальное) схематическое "доказательство".

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

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

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

( A TIMES В ) { <все атрибутам А } = А

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

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

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

6.5. Короткий ответ— нет. Оригинальный оператор Кодда DIVIDEBY удовлетворяет следующему условию.

( A TIMES В ) DIVIDEBY В = А

Однако необходимо принять к сведению следующее.

" Оператор деления Кодда был бинарным, а наш оператор DIVIDEBY является триадическим; следовательно, он не может удовлетворять подобному свойству.

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

( A DIVIDEBY В ) TIMES В < А

Оператор DIVIDEBY Кодда больше похож на целочисленное деление в обычной арифметике (т.е. он игнорирует остаток).

6.6. Ловушка заключается в том, что в операции JOIN атрибуты CITY используются так же, как и атрибуты St и Pt (в силу нашего определения оператора JOIN). Результат будет подобен следующему.

s#

SNAME

STATUS

CITY

P#

QTY

PNAME

COLOR

WEIGHT

SI

Smith

20

London

PI

300

Nut

Red

12.0

SI

Smith

20

London

P4

200

Screw

Red

14.0

SI

Smith

20

London

P6

100

Cog

Red

19.0

S2

Jones

10

Paris

P2

400

Bolt

Green

17.0

S3

Black

30

Paris

P2

200

Bolt

Green

17.0

S4

Clark

20

London

P4

200

Screw

Red

14.0

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

  2. Да, есть такое отношение, а именно— TABLE_DEE. Отношение TABLE_DEE (далее для краткости — просто DEE) — аналог числа 1 по отношению к умножению в обычной арифметике, поскольку для всех отношений R имеем следующее.

R TIMES DEE s DEE TIMES R = R

Иначе говоря, DEE — это тождественный элемент для операции TIMES (и конечно, для операции JOIN).

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

R TIMES DUM = DUM TIMES R = <пустое отношение с тем же

заголовком, что и заголовок R>

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

ONION

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

В случае вычитания первый операнд показан слева в таблице, а второй — вверху (для других операторов, конечно, операнды могут меняться местами). Обратите внимание, как это напоминает таблицы истинности для логических операций OR, AND, AND NOT соответственно. Конечно, такое совпадение не случайно.

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

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

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

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

Для операций расширения и подведения итогов имеем следующее.

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

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

  1. Нет!

  2. Мы можем определить (и определяем) объединение, пересечение, произведение или соединение одного отношения R как само R. Рассмотрим случай, когда п=0. Пусть RT — некоторый тип отношений. Тогда имеем следующее.

  • Объединением нулевого числа отношений типа RT будет пустое отношение типа RT. Обратите внимание, что при этом должен существовать какой-либо способ указания того, что RT — операнд операции объединения.

  • Пересечением нулевого числа отношений типа RT является "универсальное" отноше- ние типа RT, где термин "универсальное отношение типа RT" обозначает отношение типа RT, тело которого состоит из всевозможных кортежей, удовлетворяющих заго- ловку отношения (при этом, опять-таки, должен быть какой-то способ указания того, что RT — операнд операции пересечения). Заметьте, что термин "универсальное от- ношение" часто употребляется в литературе с другим значением [12.19]!

■ Произведением и пересечением нулевого числа отношений будет TABLE_DEE.

6.13. J

  1. J WHERE CITY = 'London'

  2. ( SPJ WHERE Ji = Jt f 'Jl' ) ) { Si }

  3. SPJ WHERE QTY > QTY ( 300 ) AND QTY < QTY ( 750 )

  4. P { COLOR, CITY }

  5. ( S JOIN P JOIN J ) { St, Pt, Jt }

  6. ( ( { S RENAME CITY AS SCITY ) TIMES

{ P RENAME CITY AS PCITY ) TIMES

( J RENAME CITY AS JCITY ) ) WHERE SCITY Ф PCITY OR PCITY Ф JCITY OR JCITY * SCITY ) { St, Pt, Jt }

6.20. ( ( ( S RENAME CITY AS SCITY ) TIMES

( P RENAME CITY AS PCITY ) TIMES

( J RENAME CITY AS JCITY ) ) WHERE SCITY Ф PCITY AND PCITY Ф JCITY AND JCITY Ф SCITY ) { St, Pt, Jt }

  1. P SEMI JOIN ( SPJ SEMI JOIN ( S WHERE CITY = 'London' ) )

  2. Для того чтобы напомнить о такой возможности, приводим пошаговое решение этой задачи.

WITH ( S WHERE CITY = 'London' ) AS Tl, ( J WHERE CITY = 'London' ) AS T2, { SPJ JOIN Tl ) AS T3, T3 { Pt, Jt } AS T4, { T4 JOIN T2 j AS T5 : T5 { Pt }

Вот как выглядит этот же запрос без использования WITH.

( ( SPJ JOIN { S WHERE CITY = 'London' ) ) { Pt, Jt }

JOIN ( J WHERE CITY = 'London' ) ) { Pt } Далее приводятся ответы к следующим упражнениям (как с предложением WITH так и без него).

6.23. ( ( S RENAME CITY AS SCITY ) JOIN SPJ JOIN

( J RENAME CITY AS JCITY ) ) { SCITY, JCITY }

  1. ( J JOIN SPJ JOIN S ) { Pt }

  2. ( ( ( J RENAME CITY AS JCITY ) JOIN SPJ JOIN

( S RENAME CITY AS SCITY ) )

WHERE JCITY Ф SCITY ) { Jt }

6.26. WITH ( SPJ { St, Pt } RENAME St AS XSt, Pt AS XP| ) AS Tl,

( SPJ { St, Pt } RENAME St AS YSt, Pt AS YP| ) AS T2, ( Tl TIMES T2 ) AS T3,

( ТЗ WHERE XS# = YSt AND XPt < YPt ) AS T4 : T4 { XPt, YPt }

6.27. ( SUMMARIZE SPJ { St, Jt }

PER RELATION { TUPLE { St St ( 'SI' ) } } ADD COUNT AS N ) { N }

Напоминаем, что фигурирующее в предложении PER выражение является вызовом оператора выбора (в действительности это отношение-литерал).

6.28. ( SUMMARIZE SPJ { St, Pt, QTY }

PER RELATION { TUPLE { St St ( 'SI' ), Pt Pt ( 'PI' ) } } ADD SUM ( QTY ) AS Q ) { Q }

  1. SUMMARIZE SPJ PER SPJ { Pi, Jt } ADD SUM ( QTY ) AS Q

  2. WITH ( SUMMARIZE SPJ PER SPJ { Pt, Jt }

ADD AVG ( QTY ) AS Q ) AS Tl, ( Tl WHERE Q > QTY ( 350 ) ) AS T2 : T2 { Pt }

  1. ( J JOIN ( SPJ WHERE St = St ( 'SI' ) ) ) { JNAME }

  2. ( P JOIN ( SPJ WHERE St = St ( 'SI' ) ) ) { COLOR }

  3. ( SPJ JOIN ( J WHERE CITY = 'London' ) ) { Pt }

  4. ( SPJ JOIN ( SPJ WHERE St = St ( 'SI' ) ) { Pt } ) { Jt }

  5. ( ( ( SPJ JOIN

( P WHERE COLOR = COLOR { 'Red' ) ) { Pt } ) { St }

JOIN SPJ ) { Pt } JOIN SPJ ) { St }

6.36. WITH ( S { St, STATUS } RENAME St AS XSt,

STATUS AS XSTATUS ) AS Tl, ( S { St, STATUS } RENAME St AS YSt,

STATUS AS YSTATUS ) AS T2,

( Tl TIMES T2 ) AS T3,

( T3 WHERE XSt = St ( 'SI' ) AND

XSTATUS > YSTATUS ) AS T4 :

T4 { YSt }

6.37. ( ( EXTEND J ADD MIN ( J, CITY ) AS FIRST )

WHERE CITY = FIRST ) { Jt }

Каким будет результат выполнения этого запроса в случае, когда базовая перемен- ная-отношение J пуста?

6.38. WITH ( SPJ RENAME Jt AS ZJt )' AS Tl,

( Tl WHERE ZJt = Jt AND Pt = Pt ( 'PI' ) ) AS T2,

( SPJ WHERE Pt = Pt ( 'PI' ) ) AS T3,

( EXTEND T3 ADD AVG ( T2, QTY ) AS QX ) AS T4,

T4 { Jt, QX } AS T5,

( SPJ WHERE Jt = Jt ( 'JI' ) ) AS T6,

( EXTEND Тб ADD MAX ( T6, QTY ) AS QY ) AS T7, ( T5 TIMES T7 { QY } ) AS T8, ( T8 WHERE QX > QY ) AS T9 : T9 { Ji }

6.39. WITH ( SPJ WHERE Pt = Pt { 'Pi' ) ) AS Tl,

Tl { St, Jt, QTY } AS T2,

{ T2 RENAME Jt AS XJt, QTY AS XQ ) AS T3,

( SUMMARIZE Tl PER SPJ { Jt }

ADD AVG ( QTY ) AS Q AS T4, ( T3 TIMES T4 ) AS T5, ( T5 WHERE XJt = Jt AND XQ > Q ) AS Тб : T6 { St }

6.40. WITH ( S WHERE CITY = 'London' ) { St } AS Tl,

( P WHERE COLOR = COLOR ( 'Red' ) ) AS T2, ( Tl JOIN SPJ JOIN T2 ) AS T3 : J { Jt } MINUS T3 { Jt }

  1. J { Jt } MINUS { SPJ WHERE St * St ( 'SI' ) ) { Jt }

  2. WITH ( ( SPJ RENAME Pi AS X ) WHERE X = Pi ) { Ji } AS Tl,

( J WHERE CITY = 'London' ) { Jt } AS T2, ( P WHERE Tl > T2 ) AS T3 : T3 { Pt }

  1. S { St, Pt } DIVIDEBY J { Jt } PER SPJ { Si, Pi, Jl }

  2. ( J WHERE

( ( SPJ RENAME Ji AS Y ) WHERE Y = Ji ) { Pi } > ( SPJ WHERE Si = Si { 'SI' ) ) { PI } ) { Jt }

  1. S { CITY } UNION P { CITY } UNION J { CITY }

  2. ( SPJ JOIN ( S WHERE CITY = 'London' ) ) { Pi } UNION

( SPJ JOIN ( J WHERE CITY = 'London' ) ) { Pt }

6.47. ( S TIMES P ) { St, Pi } MINUS SP { St, Pt }

6.48. Предоставляем два решения этой задачи. В первом решении, принадлежащем Хью Дарвену, используются только операторы из разделов 6.2 и 6.3.

WITH ( SP RENAME Si AS SA ) { SA, Pt } AS Tl,

/* Tl {SA, Pi} : SA поставляет деталь Pi */

( SP RENAME Si AS SB ) { SB, P| } AS T2, /* T2 {SB, Pt} : SB поставляет деталь Pi */

Tl { SA } AS T3,

/* T3 {SA} : SA поставляет некоторую деталь */ T2 { SB } AS T4,

/* T4 {SB} : SB поставляет некоторую деталь */

{ Tl TIMES T4 ) AS T5,

/* T5 {SA,SB,P|} : SA поставляет некоторую деталь, и SB поставляет деталь Pi */

( Т2 TIMES ТЗ ) AS Тб,

/* Тб {SA,SB,Pi} : SB поставляет некоторую деталь, и SA поставляет деталь Р# */

( Tl JOIN Т2 ) AS Т7,

/* Т7 {SA,SB,Pi} : SA и SB поставляют деталь Pi */ ( ТЗ TIMES Т4 ) AS Т8,

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

SP { Pi } AS Т9,

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

( Т8 TIMES Т9 ) AS Т10,

/* Т10 {SA,SB,P|} :

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

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

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

( Т10 MINUS Т7 ) AS Til,

/* Til {SA,SB,Pi} : деталь Pi поставляется,

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

{ Тб INTERSECT Til ) AS Т12,

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

( Т5 INTERSECT Til ) AS T13,

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

Т12 { SA, SB } AS T14,

/* T14 {SA,SB} : SA поставляет некоторую деталь,

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

Т13 { SA, SB } AS T15,

/* T15 {SA,SB} : SB поставляет некоторую деталь,

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

( Т14 UNION Т15 ) AS Т16,

/* Т16 {SA,SB} : некоторая деталь поставляется

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

Т7 { SA, SB } AS T17,

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

{ Т17 MINUS Т16 ) AS Т18,

/* Т18 {SA,SB} : некоторая деталь поставляется как поставщиком SA, так и поставщиком SB, ни одна деталь, поставляемая SA, не поставляется поставщиком SB, и ни одна деталь, поставляемая SB, не поставляется поставщиком SA — таким образом, SA и SB поставляют в точности одни и те же детали */

( Т18 WHERE SA < SB ) AS T19 : /* завершающий шаг */

Т19

Во втором решении, которое является более прямолинейным, используются реля- ционные сравнения, рассмотренные в разделе 6.9.

WITH ( S RENAME St AS SA ) { SA } AS RA , { S RENAME St AS SB ) { SB } AS RB : ( RA TIMES RB)

WHERE { SP WHERE St = SA ) { Pt } =

{ SP WHERE St = SB ) { Pt } AND SA < SB

  1. SPJ GROUP ( Ji, QTY ) AS JQ

  2. Обозначим через SPQ результат выполнения выражения, полученного в ответе к упр. 6.49. Тогда имеем следующее.

SPQ UNGROUP JQ

Глава

Реляционное исчисление

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]