1 РЕЛЯЦИОННЫЕ БАЗЫ ДАННЫХ 1. О базах данных База данных обеспечивает хранения больших объемов сложных структурированных данных. Кроме выполнения функции надежного хранилища больших объемом данных база данных должна обеспечивать возможность простого извлечения из содержащихся в ней данных тех, которые удовлетворяют заданным пользователем критериям. Различают базы данных иерархические, сетевые и реляционные. Базы данных поддерживаются специальными программами, такими как Access и SQL Server. Эти программы называются системами управления базами данных (СУБД). Наиболее распространены реляционные базы данных, в которых для хранения данных применяются связанные между собой таблицы. Простая база данных может включать в свой состав всего одну таблицу. Но чаще всего такое решение недопустимо. Для примера возьмем базу данных о книгах фонда библиотеки. В ней можно было бы хранить информацию о книгах, авторах и издательствах. Эта таблица могла бы иметь структуру, показанную на рис. 1. Рис. 1. Структура таблицы «Фонд библиотеки» Попытка хранить эти данные в одной таблице неизбежно приводит к дублированию данных. Ведь один и тот же автор может автором не одной, а нескольких книг. Следовательно, информация об авторе должна будет дублироваться для каждой новой книги этого автора. Дублирование же данных вообще недопустимо. Оно, в конце концов, всегда приводит к рассогласованию данных. Выход в этой ситуации – вместо одной таблицы применить три: одну таблицу для книг, вторую – для авторов, и третью таблицу – для издательств. Для хранения данных, относящихся к каждой сущности (книга, автор, издательство) следует предусматривать отдельную таблицу. На рис. 2 – 4 показана возможная структура этих трех таблиц. Рис. 2. Структура таблицы Книги Рис. 3. Структура таблицы Авторы Рис. 4. Структура таблицы Издательства Таблица – это совокупность строк и столбцов. Строка таблицы называется записью, столбец называется полем. Каждая таблица должна иметь столбец, значения данных в котором не повторяются. В базе данных такие сведения носят название первичного ключа таблицы. Первичный ключ применяется для связи с другими таблицами. Он не может не иметь значения, его значение должно быть уникальным в пределах столбца таблицы, его значение задается СУБД автоматически при создании новой записи и его невозможно изменить. В качестве первичного ключа часто применяется счетчик. Первичный ключ записи для краткости называют кодом записи. 2 Замечательным свойством баз данных является возможность обеспечивать целостность данных. Если при создании новой записи указан ошибочный вторичный ключ (в таблице, код записи которой должен использоваться в создаваемой записи в качестве вторичного ключа, нет записи с кодом, равным введенному значению вторичного ключа), то сохранить такую запись СУБД не позволит. Система также не позволит удалить запись таблицы, если ее код используется в качестве вторичного ключа в какой либо записи другой таблицы. 2. Виды связи между таблицами Вернемся к рассмотренному в предыдущем разделе примеру о библиотечном фонде. Таблица книг связана с таблицей авторов. Но один и тот же автор может быть автором не единственной, а нескольких книг. Такая связь между таблицей книг и таблицей авторов представляет собой отношение «один-ко-многим» (значение первичного ключа записи в таблице авторов может использоваться в нескольких записях таблицы книг). Для реализации такой связи между таблицей книг и таблицей авторов в таблице книг следует поместить поле вторичного ключа, в котором для каждой книги указывается значение первичного ключа соответствующего автора в таблице авторов. Учтем, что у книги может быть не один, а несколько авторов. С другой стороны, отдельный автор может быть автором нескольких книг. Следовательно, для каждой записи таблицы книг может существовать несколько записей в таблице авторов. И, наоборот, для каждой записи в таблице авторов может существовать несколько записей в таблице книг. Такой тип связи между таблицами называется отношением «многие-ко-многим». Это проблема. Попытку сохранить данные о книге в одной записи, как это делалось выше для связи типа «один-ко-многим», добавив поля для каждого отдельного автора книги, нельзя признать удачной. Сколько бы не было включено полей для дополнительных авторов, этих полей может оказаться недостаточно. И в то же время, когда авторов книги немного, лишние поля останутся пустыми, что приведет к нерациональному использованию памяти. Итак, при применении типа связи «один-ко-многим» между таблицей Книги и таблицей Авторы в базе данных не удастся хранить сведения о произвольном количестве авторов одной книги. Решением этой проблемы при связи типа «многие-ко-многим» является создание третьей, связующей, таблицы, имеющей всего два поля. В одно поле связующей таблицы записывается первичный ключ книги. Во второе поле записывается первичный ключ автора. С помощью связующей таблицы отношение «многие-ко-многим» разбивается на два отношения «один-ко-многим». Если у книги несколько авторов, то запись с первичным ключом книги в связующей таблице повторяется столько раз, сколько авторов у книги. В этой связующей таблице роль первичного ключа играют два вторичных ключа, сочетание значений которых, является уникальным для всей совокупности записей связующей таблицы. При выборе типа связи «многие-ко-многим» межу таблицей Книги таблицей Авторы потребуется четвертая связующая таблица, которую мы будем называть КнгАвт, а также изменится структура таблицы Книги. Ведь с появлением таблицы КнгАвт в таблице книги становится лишним поле КодАвт. Структуры этих таблиц приведены на рис. 5 и рис. 6. Рис. 5. Структура таблицы Книги при связи типа «многие-ко-многим» Рис. 6. Структура связующей таблицы КнгАвт Структура таблиц Авторы и Издательства не изменяется. 3 3. Создание базы данных «Библиотека» в СУБД Microsoft Office Access 2007 Создать базу данных относительно не сложно с помощью приложения Microsoft Office Access 2007. Приступите к созданию новой базы данных, содержащей информацию о книгах библиотеки. Которая будет иметь три связанные таблицы: Книги, Авторы, Издательства, структура которых показана на рис. 2 - 4. Для этого: 1. Создайте свою рабочую папку (в компьютерном классе ИВЦ МЭИ она должна находиться в корневом каталоге диска d). 2. Запустите приложение Access 2007 (Пуск, Все программы, Microsoft Office, Microsoft Office Access 2007). Нажмите на кнопке Новая база данных. В появившемся поле Имя файла введите Библиотека. 3. Под именем файла укажите расположение файла создаваемой базы данных (можно воспользоваться кнопкой Поиск расположения для размещения базы данных). 4. Нажмите на кнопку Создать. Появится Таблица1, в которой поле Код будет играть роль первичного ключа таблицы. Его значения задаются системой автоматически. Их не следует пытаться изменять. 5. Для создания нового поля следует щелкнуть на имени поля Добавить поле правой кнопкой мыши и выполнить команду контекстного меню Вставить столбец. 6. Заданное по умолчанию имя поля Поле1 можно изменить. Для переименования поля следует щелкнуть на его имени правой кнопкой мыши и выполнить команду контекстного меню Переименовать столбец. Выполните эту команду, а в качестве имени столбца введите Название и нажмите клавишу Enter. 7. Добавьте новые поля с именами: ГодИзд, КодАвт, КодИзд, Цена, Количество. 8. Сохраните файл. При выполнении сохранения в поле Имя таблицы введите Книги. 9. Для создания новой таблицы перейдите на вкладку ленты Создание. В группе команд Таблицы выберите команду Таблица. Появится новая (вторая) Таблица1 с полем Код. 10. Сохраните файл. При сохранении второй таблице задайте имя Авторы. 11. Создайте в этой таблице еще два новых поля соответственно с именами Фамилия и Имя. 12. Создайте новую таблицу (третью) Таблица1. Дополнительно к полю Код создайте в этой таблице новое поле с именем Название. 13. Сохраните файл. При сохранении этой таблицы задайте имя Издательства. Теперь пора заняться выбором типа данных полей каждой таблицы. По умолчанию поле Код каждой из трех созданных таблиц имеет тип Счетчик. Поскольку это поле для каждой таблицы играет роль первичного ключа, то такой тип нас устраивает и изменять его не следует. Все остальные поля каждой таблицы по умолчанию имеют тип Текстовый. Это тоже нас устраивает для всех полей, кроме полей ГодИзд, КодАвт, КодИзд, Цена и Кол-во таблицы Книги. В полях КодАвт и КодИзд, указывается значение первичного ключа соответствующей записи таблиц Авторы и Издательства. Тип Текстовый этих двух полей необходимо изменить на тип Числовой. Тип Текстовый полей ГодИзд, Количество необходимо также изменить на тип Числовой. Тип Текстовый поля Цена необходимо изменить на тип Денежный. 14. Для выполнения изменения типа поля при открытой таблице Книги на вкладке ленты Главная выполните команду Режим для перехода из режима Таблицы в режим Конструктор. В режиме Конструктор в открытой таблице Книги щелкните в поле Тип данных в строке КодАвт. Щелчком на появившейся в этом поле справа стрелке раскройте 4 список типов и выберите в нем тип Числовой. Затем в поле Тип данных щелкните в строке КодИзд и выберите тип Числовой. Действуя аналогично, задайте тип Числовой для полей ГодИзд, и Кол-во, а также задайте тип Денежный для поля Цена. 15. Выполните сохранение сделанных изменений. Для возврата в режим таблицы снова выполните команду Режим. 16. Закройте все три таблицы. Для закрытия каждой таблицы нужно сделать правый щелчок на расположенном над таблицей имени таблицы и выполнить команду контекстного меню Закрыть. Теперь для обеспечения целостности данных следует установить связи между таблицами. Для таблиц Авторы и Издательства следует установить с таблицей Книги отношение «один-ко-многим». При этом СУБД Access не позволит сохранить новую запись в таблице Книги, если в полях КодАвт и КодИзд не указаны существующие первичные ключи записей соответственно таблиц Авторы и Издательства. 17. Для установления связи между таблицами на вкладке Работа с базами данных в группе Показать или скрыть выполните команду Схема данных. Появится окно Схема данных, а также окно Добавление таблицы. 18. В окне Добавление таблицы поочередно выберите каждую из трех таблиц и после ее выбора нажмите на кнопку Добавить. Все три таблицы отобразятся на схеме данных. Закройте окно Добавление таблицы. Для удобства дальнейшей работы переместите таблицы (захватив заголовок) так, чтобы их взаимное расположение соответствовало рис. 7: Рис. 7. Начало создания схемы данных 19. Перетащите поле первичного ключа из таблицы Авторы на поле КодАвт (поле вторичного ключа) в таблице Книги. Откроется показанное на рис. 8 диалоговое окно Изменение связей. Рис. 8 Установление связей между таблицами 5 Для поддержания целостности данных для этой связи установите флажок Обеспечение целостности данных. Нажмите кнопку Создать. Access проведет линию связи между двумя таблицами, которая толще на каждом конце. Кроме того над широкой частью на одном конце линии связи будет отображено число 1, а над широкой частью на другом конце линии – символ бесконечности (∞). 20. Действуя аналогично, свяжите поле Код таблицы Издательства с полем КодИзд таблицы Книги. Результат выполнения связей таблиц должен соответствовать рис. 9. Рис. 9. Итог создания схемы данных 21. Сохраните созданный файл. На этом работа по созданию базы данных закончена. 4. Заполнение базы данных Библиотека Вам предстоит начать ввод данных в базу данных Библиотека. При этом необходимо придерживаться определенного порядка. Предположим, что базу данных следует ввести информацию о новой книге. До заполнения соответствующей записи в таблице Книги нужно быть уверенным, что данные автора книги уже имеется в таблице Авторы, а также данные издательства также уже имеются в таблице Издательства. В связи с этим требованиями следует придерживаться следующего порядка при вводе данных: a) Если данные автора книги отсутствуют в таблице Авторы, то создать и заполнить новую запись в таблице Авторы и сохранить базу данных. Если у книги больше одного автора, то введите данные только первого из них. В созданной базе данных не предусмотрена возможность хранить информацию более чем об одном авторе. Если же необходимо хранить информацию о любом числе авторов книги, то следует создать другую базу данных, в которой вместо связи типа «один-ко-многим» таблиц Авторы и Книги нужно применить связь типа «многие-ко-многим». b) Если данные издательства книги отсутствуют в таблице Издательства, то создать и заполнить новую запись в таблице Издательства и сохранить базу данных. c) Создать и заполнить новую запись в таблице Книги и сохранить базу данных. Приступите к вводу информации в базу данных Библиотека. 1. Введите в базу данных Библиотека данные о пяти книгах, приведенные в табл. 1. 2. Сохраните базу данных. 3. Покажите преподавателю результаты проделанной работы. 5. Создание базы данных «Библиотека2» В этой базе данных можно будет хранить информацию о любом числе авторов книги. Для этого придется установить связь типа «многие-ко-многим» между таблицами Книги и Авторы. Применение этого типа связи приведет к необходимости добавления в базу данных еще одной связующей таблицы КнгАвт. Теперь база данных будет включать в свой состав четыре таблицы. Структура этих таблиц показана на рис. 3 – 6. 6 Авторы Шевякова Дарья Степанов Андрей Дукин Алексей Гарбер Геннадий Название Самоучитель Basic 2008 Год издания Visual 2008 Основы 2008 программирования на Visual Basic и VBA в Excel Просто о Visual Basic 2009 2008 Изд-во БХВПетербург Таблица 1. Количество Цена экземпляров руб. 10 436 Солон-Пресс 3 120 Дейтейл Пол БХВ3 537 Дейтейл Харви Петербург Эйр Грег Албахари Джозеф LINQ. Карманный 2009 БХВ5 218 Албахари Бен справочник Петербург Глушаков Сергей Visual Basic.NET 2008 2008 АСТ Москва 5 394 Клевцов Александр Приступите к созданию базы данных Библиотека2. 1. Создайте новую базу данных, содержащую четыре таблицы: Книги, Авторы, Издательства и КнгАвт. 2. Задайте связи между таблицами и создайте схему данных, показанную на рис. 10. Рис. 10. Схема данных при связи таблиц Книги и Авторы «многие – ко многим» 3. Введите в базу данных Библиотека2 данные о пяти книгах, приведенные в табл. 1. 4.Сохраните базу данных. 5. Попробуйте ответить на вопросы для контроля. 6. Покажите преподавателю результаты проделанной работы. 6. Вопросы для контроля 1. Что представляет собой реляционная база данных? 2. Поясните понятия таблица, поле, запись. 3. Что такое первичный ключ, вторичный ключ? 4. Как осуществляется связь между таблицами с помощью первичных и вторичных ключей? 5. Поясните виды связи между таблицами один-ко-многим, многие-ко-многим. 6. Зачем нужна дополнительная таблица при связи между двумя таблицами многие-комногим? 7. Что означает требование обеспечения целостности данных?