Построение реляционных баз данных (1088288), страница 3
Текст из файла (страница 3)
Результатом этих операторов является таблица с двумя столбцами и N строками. Для обработки результатов этого запроса пишется прикладная программа, которая предполагает, что на выходе эти операторы выдают файл с N записями. Приложение открывает этот запрос, обрабатывает первую строку, следующую строку и так далее, пока не будет обработана последняя строка. Логика здесь та же, что и при обработке файла с последовательным доступом. Примеры таких прикладных программ вы увидите в главах 12, 13, 15 и 16. На данный момент просто знайте, что есть несоответствие между базовой ориентацией SQL (отношения) и языком программирования (строка, или запись) и что это несоответствие необходимо корректировать, когда прикладные программы обращаются к реляционной базе данных посредством SQL.
Реляционная алгебра
Реляционная алгебра похожа на алгебру, которую вы учили в старших классах школы, но с одним важным отличием. В школьной алгебре переменные представляли числа, и операторы +, - хи / оперировали численными величинами. В реляционной алгебре переменные — это отношения: операторы действуют на отношения, и результатом их действия являются новые отношения. Например, операция объединения комбинирует кортежи одного отношения с кортежами другого отношения, в результате чего получается третье отношение. Реляционная алгебра является замкнутой, то есть результаты одной или более реляционных операций всегда представляют собой отношение.
Отношения — это множества. Кортежи отношения можно рассматривать как элементы множества, следовательно, те операции, которые определены для множеств, могут выполняться и над отношениями. Сначала мы продемонстрируем четыре таких оператора из теории множеств, а затем обсудим другие операторы, специфичные для реляционной алгебры. Но прежде мы рассмотрим примеры отношений, которые будут использоваться нами на протяжении этой и следующей глав.
Реляционные операторы
На рис. 8.8 показано шесть отношений и определения их атрибутов и доменов. Обратите внимание, что атрибут НазваниеПредмета фигурирует в нескольких отношениях. В связи с этим атрибут НазваниеПредмета в отношении ЗАНЯТИЯ иногда обозначается как ЗАНЯТИЯ.НазваниеПредмета.
В ходе дальнейшего изложения символьные значения приводятся в одинарных кавычках, а те символы, которые не заключены в кавычки, относятся к именам. Так, 'АУДИТОРИЯ' и Аудитория отличаются тем, что 'АУДИТОРИЯ' — это значение, а Аудитория — это, например, имя домена. Что касается числовых данных, то числа, не заключенные в кавычки, представляют собой числовые данные, а числа н кавычках — строки. То есть 123 — это число, а '123' — это строка, составленная из символов Т, '2' и '3'.
Объединение
Объединение (union) двух отношений — это комбинирование кортежей одного отношения с кортежами другого отношения, в результате чего получается третье отношение. Порядок, в котором кортежи следуют в результирующем отношении, несуществен, но повторяющиеся строки должны быть удалены. Объединение отношений А и В обозначается А + В.
Чтобы данная операция имела смысл, отношения должны быть совместимы по объединению (union compatible), то есть оба отношения должны иметь одинаковое количество атрибутов, и атрибуты в соответствующих столбцах должны принадлежать одному и тому же домену. Если, например, третий атрибут одного из отношений принадлежит домену Аудитории, то третий атрибут второго отношения также должен принадлежать этому домену.
На рис. 8.8 отношения ТРЕТЬЕКУРСНИК и ПОЧЕТНЫЙ_СТУДЕНТ совместимы по объединению, поскольку оба они имеют по три атрибута, и соответствующие атрибуты принадлежат одному и тому же домену. Атрибуты ТРЕТЬЕКУРСНИК.СтНомер и ПОЧЕТНЫЙ_СТУДЕНТ.Номер принадлежат домену ИдентификаторыЛюдей; атрибуты ТРЕТЬЕКУРСНИК.Имя и ПОЧЕТНЫЙ_СТУДЕНТ.Имя принадлежат домену ИменаЛюдей; атрибуты ТРЕТЬЕКУРСНИК.Специальность и ПОЧЕТНЫЙ_СТУДЕНТ.Интересы принадлежат домену НазванияПредметов. Отношения ТРЕТЬЕКУРСНИК и ЗАНЯТИЯ имеют по три атрибута, но они несовместимы по объединению (union incompatible), поскольку их атрибуты происходят из разных доменов.
На рис. 8.9 показано объединение отношений ТРЕТЬЕКУРСНИК и ПОЧЕТНЫЙ. СТУДЕНТ. Обратите внимание, что кортеж [123, ДЖОНС, ИСТОРИЯ], который фигурирует в обоих отношениях, не дублируется в объединении.
Разность
Разность (difference) двух отношений — это отношение, содержащее все кортежи, которые присутствуют в первом отношении, но не присутствуют во втором. Отношения должны быть совместимы по объединению. Разность отношений ТРЕТЬЕКУРСНИК и ПОЧЕТНЫЙ_СТУДЕНТ показана на рис. 8.10. Как и в арифметике, при вычитании порядок следования аргументов имеет значение, так что А - В не равняется В - А.
Пересечение
Пересечение (intersection) двух отношений — это отношение, содержащее кортежи, которые присутствуют и в первом, и во втором отношении. Отношения должны быть совместимы по объединению. На рис. 8.11 пересечение отношений ТРЕТЬЕКУРСНИК и ПОЧЕТНЫЙ_СТУДЕНТ содержит всего один кортеж [123, ДЖОНС, ИСТОРИЯ], поскольку это единственный кортеж, который присутствует в обоих отношениях.
Произведение
Произведение (product) двух отношений (иногда его называют декартовым произведением (Cartesian product)) — это попарная конкатенация всех строк одного отношения со всеми строками другого. Произведение отношения А, имеющего m кортежей, и отношения В, имеющего п кортежей, имеет m х п кортежей. Произведение обозначается А х В. На рис. 8.12 отношение СТУДЕНТ имеет четыре кортежа, а отношение
ЗАПИСЬ — три кортежа. Отношение СТУДЕНТ х ЗАПИСЬ имеет, таким образом, двенадцать кортежей (рис. 8.13). (Некоторые кортежи результирующего отношения па рис. 8.13 не имеют смысла. Чтобы извлечь из этого отношения осмысленную информацию, потребуются дополнительные операции, которые будут описаны позднее. Рисунок является не более чем иллюстрацией действия оператора.)
Проектирование
Проектирование (projection) — это операция, которая выделяет заданные атрибуты отношения. Результатом проектирования является новое отношение, содержащее выбранные атрибуты; иными словами, при проектировании из исходного отношения выбирается некоторое множество столбцов. В качестве примера рассмотрим отношение СТУДЕНТ из рис. 8.12, а. На рис. 8.14, а показана проекция этого отношения на атрибуты Имя и Специальность, которая обозначена СТУДЕНТ [Имя, Специальность]. На рис. 8.14, б показана проекция этого отношения на атрибуты Специальность и Курс, обозначенная СТУДЕНТ [Специальность, Курс].
Обратите внимание, что хотя отношение СТУДЕНТ имеет четыре кортежа, проекция СТУДЕНТ [Специальность, Курс] имеет только три. Один кортеж был исключен, поскольку после выполнения операции проектирования кортеж [ИСТОРИЯ, С1] оказался в результирующем отношении в двух экземплярах. Так как результат проектирования является отношением, а отношение не может иметь одинаковых кортежей, избыточный кортеж был исключен.
Проекцию можно также использовать для изменения порядка следования атрибутов в отношении. Например, проекция СТУДЕНТ [Курс, Специальность, Имя, ЛичныйНомер] меняет порядок атрибутов в отношении СТУДЕНТ на обратный (исходный порядок представлен на рис. 8.11). Иногда эта возможность позволяет сделать два отношения совместимыми по объединению.
Выборка
В то время как оператор проектирования выделяет вертикальное подмножество (столбцы) отношения, оператор выборки (selection) выделяет горизонтальное подмножество (строки). Проектирование указывает, какие атрибуты должны быть в новом отношении, а выборка указывает, какие строки должны в нем присутствовать. Обозначается выборка путем указания имени отношения, за которым следует ключевое слово WHERE («где»), за которым, в свою очередь, идет условие, накладываемое на атрибуты. На рис. 8.15, а представлена выборка СТУДЕНТ WHERE Специальность = 'МАТЕМАТИКА', а на рис. 8.15, б - СТУДЕНТ WHERE Курс = 'С1\
Соединение
Операция соединения (join) представляет собой комбинацию произведения, выборки и (возможно) проектирования. Соединение двух отношений А и В происходит следующим образом. Сначала формируется произведение А х В. Затем делается выборка, при которой исключаются некоторые кортежи (критерии отбора указываются в операторе соединения). После этого путем проектирования могут быть (при необходимости) исключены некоторые атрибуты.
Рассмотрим отношения СТУДЕНТ и ЗАПИСЬ, показанные на рис. 8.12. Предположим, мы хотим знать имя и номер каждого студента. Чтобы получить эти данные, нам нужно соединить кортежи отношения СТУДЕНТ с соответствующими кортежами отношения ЗАПИСЬ на основании атрибута НомерСтудента. Такое соединение мы обозначаем как СТУДЕНТ JOIN (ЛичныйНомер= НомерСтудента) ЗАПИСЬ . Эта запись означает: «Соединить кортеж отношения СТУДЕНТ с кортежем отношения ЗАПИСЬ, если значение атрибута ЛичныйНомер в отношении СТУДЕНТ равняется значению атрибута НомерСтудента в отношении ЗАПИСЬ».
Чтобы построить это соединение, мы сначала находим произведение отношений СТУДЕНТ и ЗАПИСЬ — результат этой операции представлен на рис. 8.13. Затем мы выбираем те кортежи произведения, где значение атрибута ЛичныйНомер из отношения СТУДЕНТ равно значению атрибута НомерСтудента из отношения ЗАПИСЬ (таких кортежей только три). Результат этой операции изображен на рис. 8.16, а. Заметьте, что у нас имеется два идентичных атрибута: СТУДЕНТ.ЛичныйНомер п ЗАПИСЬ.НомерСтудента. Один из них является лишним, и мы его исключаем путем проектирования (в данном случае мы выбираем ЗАПИСЬ.НомерСтудента).
Результатом является отношение на рис. 8.16, б. Соединение на рис. 8.16, а называется эквивалентным соединением (equijoin), а соединение на рис. 8.16, б — естественным соединением (natural join). Если не указано иного, то когда говорят о соединении, подразумевается естественное соединение.