- •Недоразумения относительно термина «ключ»
- •Индексы
- •Реализация реляционной базы данных
- •Описание структуры базы данных для субд
- •Распределение пространства на физических носителях
- •Интерфейс языка запросов и обновлений
- •Хранимые процедуры
- •Интерфейс прикладных программ
- •Реляционная алгебра
- •Реляционные операторы
- •Объединение
- •Проектирование
- •Выборка
- •Соединение
- •Внешнее соединение
- •Выражение запросов в терминах реляционной алгебры
- •1. Вывести имена всех студентов. Студент [Имя]
- •Гласс рассел рай
- •Глава 8. Основы построения реляционных баз данных
- •6. Вывести названия предметов, на которые записан студент Парке, и расписание занятий по этим предметам.
Глава 8. Основы построения реляционных баз данных
4. Вывести номера студентов, записанных на предмет 'BD445'.
ЗАПИСЬ WHERE НазваниеПредмета = 'BD445' [НомерСтудента]
Это выражение выделяет соответствующие кортежи и затем проектирует их на атрибут НомерСтудента. Результатом является следующая таблица:
250 350
5. Вывести имена студентов, записанных на предмет 'BD445'.
СТУДЕНТ JOIN (ЛичныйНомер = НомерСтудента) ЗАПИСЬ WHERE НазваниеПредмета = 'BD445' [СТУДЕНТ.Имя]
Чтобы дать ответ на этот запрос, требуются данные из обеих таблиц — и СТУДЕНТ, и ЗАПИСЬ. В частности, из таблицы СТУДЕНТ берутся имена студентов, а условие «записан на предмет BD445» проверяется по таблице ЗАПИСЬ. Поскольку необходимы оба отношения, их нужно соединить. К результату соединения таблиц СТУДЕНТ и ЗАПИСЬ применяется операция выборки, за которой следует проектирование на имена студентов. Результатом является следующая таблица:
ДЖОНС БЕЙКЕР
Как уже отмечалось ранее, у двух или более отношений, входящих в выражение, могут оказаться атрибуты с одинаковыми именами. Поэтому для определенности перед именем атрибута может указываться имя отношения. Так, в нашем примере делается проекция на атрибут СТУДЕНТ.Имя. В данном случае префикс служит лишь для демонстрации, поскольку в рассматриваемое выражение не входят какие-либо другие отношения, имеющие атрибут Имя. Однако когда имена атрибутов повторяются (например, атрибут НазваниеПредмета имеется в отношениях ЗАПИСЬ и ЗАНЯТИЯ), запись с префиксом оказывается необходимой. Рассмотрим следующую задачу.
6. Вывести названия предметов, на которые записан студент Парке, и расписание занятий по этим предметам.
Чтобы ответить на этот вопрос, мы должны свести воедино данные из трех отношений. Из таблицы СТУДЕНТ мы возьмем учетный номер студента Пар-кса, из таблицы ЗАПИСЬ — предметы, на которые записан этот студент, а из таблицы ЗАНЯТИЯ — расписание занятий по этим предметам.
СТУДЕНТ WHERE Имя = 'ПАРКС JOIN (ЛичныйНомер = НомерСтудента) ЗАПИСЬ JOIN (ЗАПИСЬ.НазваниеПредмета = ЗАНЯТИЯ.НазваниеПредмета) ЗАНЯТИЯ [ЗАНЯТИЯ.НазваниеПредмета, Время]
Это выражение выделяет кортеж студента по фамилии Парке из отношения СТУДЕНТ и соединяет его с соответствующими кортежами отношения ЗАПИСЬ. Результат соединяется с соответствующими кортежами отношения ЗАНЯТИЯ. Наконец, берется проекция, которая выделяет названия предметов и время проведения занятий. Результат имеет следующий вид:
ВА200
ВА20О
Есть другие способы представления этого запроса, эквивалентные этому. Один из них выглядит так:
СТУДЕНТ JOIN (ЛичныйНомер - НомерСтудента) ЗАПИСЬ JOIN
(ЗАПИСЬ.НазваниеПредмета = ЗАНЯТИЯ.НазваниеПредмета) PFY2NBZ WHERE
Имя = 'ПАРКС [ЗАНЯТИЯ.Название, Время]
Это выражение отличается от первого тем, что выборка данных о студенте с фамилией Парке не выполняется до тех пор, пока не будут выполнены все соединения. Если предположить, что компьютер будет выполнять операции именно в таком порядке, это выражение будет вычисляться медленнее, чем предыдущее, так как придется соединять большее количество кортежей. Такие различия являются большим недостатком реляционной алгебры. С точки зрения пользователя, эквивалентные запросы должны занимать одинаковое количество времени (и, следовательно, стоить одинаково). Представьте себе недоумение пользователя, если один и тот же запрос в одной форме стоит $1.17, а в другой — $4 436. Для неискушенного пользователя такая разница в стоимости будет представляться просто чьей-то прихотью.
Для всех студентов (включая тех, кто не записан ни на один предмет) вывести номера курсов, на которых они учатся, и аудиторий, в которых они занимаются.
Поскольку результат должен содержать данные обо всех студентах, в данном запросе необходимо использовать внешнее соединение. Синтаксис прямолинеен:
СТУДЕНТ LEFT OUTER JOIN (ЛичныйНомер = НомерСтудента) ЗАПИСЬ (ЗАПИСЬ. НазваниеПредмета = ЗАНЯТИЯ.НазваниеПредмета) JOIN ЗАНЯТИЯ [Курс. Аудитория]
В результирующей таблице помимо прочего указано, на каких курсах учатся студенты Гласе и Рассел, не записанные ни на один предмет:
АС |
SC213 |
С2 |
SC110 |
АС |
ЕВ210 |
С4 |
Null |
С4 |
ЕА304 |
СЗ |
Null |
С1 |
SC110 |
С1 |
SC213 |
С1 |
ЕВ210 |
С4 |
SC110 |
Резюме
При построении реляционной базы данных требуется решить несколько задач. Во-первых, необходимо описать структуру базы данных для СУБД. Затем нужно выделить файловое пространство и заполнить базу данных информацией.
В реляционной модели данные представляются и обрабатываются в форме таблиц, называемых отношениями. Столбцы таблиц называются атрибутами, а строки — кортежами. Термины таблица, столбец и строка, а также термины файл, поле и запись являются синонимами терминов отношение, атрибут и кортеж соответственно.
Использование термина ключ может привести к неоднозначности, так как на стадии проектирования и реализации он употребляется в различных значениях. На стадии проектирования этим термином обозначается логический ключ, то есть один или несколько атрибутов, однозначно интерпретирующих строку. На стадии реализации этим термином обозначается физический ключ, то есть структура данных, используемая для повышения производительности. Логический ключ может быть, а может и не быть физическим ключом; физический ключ также может, но не обязан быть логическим ключом. В этой книге под словом ключ мы подразумеваем логический ключ, а под словом индекс — физический ключ.
Поскольку для описания структуры базы данных мы используем реляционную модель, нам нет необходимости осуществлять какие-либо преобразования на стадии реализации. Мы просто описываем имеющуюся структуру для СУБД. Есть два способа сделать это: представить описание в виде текстового DDL-файла или воспользоваться графическими средствами описания данных. В обоих случаях для СУБД описываются таблицы, столбцы, индексы, ограничения, пароли и другие элементы управления.
Помимо описания структуры базы данных, разработчики должны выделить для базы данных пространство на физическом носителе. В многопользовательских системах это может быть важно для эффективной работы СУБД. Наконец, база данных заполняется информацией, для чего используются средства, предоставляемые производителем СУБД, или программы, разработанные производителем, или и то и другое.
Есть четыре категории языков манипулирования данными: реляционная алгебра, реляционное исчисление, языки, ориентированные на преобразования, и запросы по образцу. Реляционная алгебра состоит из набора реляционных операторов, с помощью которых можно манипулировать отношениями для получения желаемого результата. Реляционная алгебра является процедурной. Языки, ориентированные на преобразования, предоставляют непроцедурные способы для преобразования набора отношений в желаемый результат. Наиболее распространенный пример — это язык SQL.
Существует три способа доступа к реляционной базе данных. Один из них состоит в том, чтобы использовать средства для генерации форм и отчетов, предоставляемые СУБД. Второй способ — использовать язык запросов и преобразований; наиболее популярным языком такого рода является SQL. Третий способ предполагает доступ через прикладные программы.
Прикладные программы могут взаимодействовать с СУБД через вызовы функций, а также с помощью методов объектов или специальных команд базы
длимых, транслируемых предварительным компилятором. Реляционная модель ориентирована на обработку одного отношения за один прием, но большинство (инков программирования обрабатывают за один прием только одну строку. Необходимо предусмотреть какие-то способы компенсации этого несоответствия.
Назначение реляционной алгебры состоит в том, чтобы манипулировать отношениями для получения желаемого результата. Она включает в себя следующие операторы: объединение, разность, пересечение, произведение, проекция, пыборка, (внутреннее) соединение и внешнее соединение.