Uploaded by Ben Richards

Proektirovanie bazy dannykh predmetnoy oblasti aeroport

advertisement
Содержание
Оглавление
Оглавление
Введение .................................................................................................................................... 2
1. Постановка задачи и анализ предметной области ............................................................. 3
2. Назначение проектируемой базы данных .......................................................................... 4
3. Проектирование инфологической модели данных ........................................................... 5
3.1. Информационные потребности пользователя ............................................................................. 5
3.2. Определение сущностей и связей ................................................................................................. 5
3.3. Определение функций пользователя, атрибутов, ключей .......................................................... 6
3.4. Выявление и описание ограничений целостности ...................................................................... 7
3.5. Разработка инфологической модели предметной области. ........................................................ 9
4. Проектирование даталогической модели БД ............................................................................... 11
4.1.Выбор СУБД. ................................................................................................................................. 11
4.2.Отображение инфологической модели ....................................................................................... 11
5.
Реализация БД ......................................................................................................................... 14
5.1.Разработка средств реализации ограничений целостности....................................................... 14
5.2 Настройка групп пользователей...................................................................................... 15
5.3.Разработка процедур ведения БД ................................................................................................ 19
5.4.Разработка процедур реализации запросов и интерфейса пользователя. ................................ 20
6. Спецификация входных и выходных запросов. .............................................................. 27
7.Спецификация запросов пользователей ............................................................................ 28
Заключение.............................................................................................................................. 29
Введение
За последние годы в нашей стране произошли значительные перемены,
которые не могли не затронуть области информатики и вычислительной техники.
Десять лет назад работа с базами данных и электронными таблицами была уделом
профессиональных программистов. Сами системы не были предназначены для
широкого пользователя. Их основным потребителем был военно-промышленный
комплекс. С появлением огромного числа банков, акционерных обществ и частных
компаний ситуация резко изменилась.
В настоящее время обработка и хранение информации не является чисто
умозрительной задачей. Потеря информации или ее несвоевременное получение
могут обернуться потерей денег. Именно этими обстоятельствами можно объяснить
столь бурный рост компьютерной техники и стремительное развитие электронных
таблиц и систем управления базами данных (СУБД) в нашей стране и за рубежом.
Для оперативного, гибкого и эффективного управления предприятиями, фирмами и
организациями
средствами
различных
гражданского
форм
и
собственности,
военного
телекоммуникационными
назначения,
информационно-
вычислительными, экологическими, радиолокационными и радионавигационными
системами широко внедряются системы автоматизированного управления, ядром
которых являются базы данных. При большом объеме информации и сложности
производимых с ней
операций проблема эффективности средств организации
хранения, доступа и обработки данных приобретает особое значение. Учитывая
важность и значимость баз данных
в современной жизни, весьма серьезные
требования предъявляются к квалификации специалистов, создающих приложения
на их основе.
1. Постановка задачи и анализ предметной области
Спроектировать базу данных для предметной области Аэропорт. Эта база
данных будет использоваться как работниками Аэропорта, так и пассажирам, а также
техническим персоналом аэропорта.
При работе с этой базой данных каждый пассажир может получить
интересующую его информацию о расписании рейсов, маршрутах, о стоимости билета.
Соответственно, каждый летчик может извлечь информацию о рейсах, которые
он обслуживает и о времени вылета. Технический персонал может получить данные о
состоянии самолёта, его экипаже и расписании рейсов.
Дополнительной информацией служат личные данные о каждом летчике
(фамилия, имя, отчество, дата рождения, паспортные данные), данные об аэропорте
(название, расстояние до него) и данные о самолетах (номер, тип, количество мест).
Эти данные могут использоваться работниками аэропорта, а также летчиками и
пассажирами
2. Назначение проектируемой базы данных
Спроектированная база данных данного примера предназначена для
автоматизированного учета работы Аэропорта.
3. Проектирование инфологической модели данных
3.1. Информационные потребности пользователя
(анализ запросов).
При разработке данного курсового проекта была
выбрана следующая
предметная область: «Аэропорт».
В ней необходимо отразить:

список обслуживающего персонала (как летчиков, так и самолетов);

информацию о стоимости билета;

расписание движения (время отправления, прибытия);

данные о маршрутах (номер, аэропорт назначения, направление);

данные о рейсах (номер рейса; номер маршрута, по которому осуществляется
движение; время отправления);

данные об аэропортах (название, номер маршрута, расстояние);

предоставление
возможности
добавления
некоторых
данных
(об
обслуживающем персонале), их удаление, изменение;

итоги продажи билетов по различным рейсам в зависимости от даты;
3.2. Определение сущностей и связей
Сущность - это объект, информация о котором должна быть представлена в
базе данных. Экземпляр сущности - это информация о конкретном представителе
объекта.
Связь - соединение между двумя и более сущностями. Экземпляр связи конкретная связь между конкретными представителями объектов.
Сущности, представленные в данном курсовом проекте:
- Маршрут (содержит информацию о маршрутах),
- Рейс (информация о рейсах),
- Летчики (информация о летчиках),
- Самолеты (информация о самолетах),
- Аэропорт (информация об аэропортах),
- Категория направления (наименование видов направлений движения
самолетов),
- Количество билетов (число проданных билетов за определенный рейс).
3.3. Определение функций пользователя, атрибутов, ключей
Атрибут - свойство сущности или связи.
Ключ сущности - атрибут или набор атрибутов, используемый для однозначной
идентификации экземпляра сущности.
Ключи и атрибуты, в данном курсовом проекте:
Сущность Маршрут. Содержит следующие атрибуты: Код маршрута, название
конечного аэропорта, направление движения. Код маршрута является ключом.
Сущность Рейс. Содержит следующие атрибуты: Код рейса, номер маршрута,
время прибытия, время отправления. Ключом будет являться Код рейса.
Сущность Летчики. Содержит следующие атрибуты: Код летчика, фамилия,
имя, отчество, паспортные данные, дата рождения. Ключ – Код летчика.
Сущность Самолеты. Содержит следующие атрибуты: Номер самолета, год
поступления на эксплуатацию, тип самолета, количество мест. Ключ – Номер
самолета.
Сущность Аэропорт. Содержит следующие атрибуты: номер маршрута, к
которому относится данный аэропорт, его название, расстояние до аэропорта. Ключ –
составной из номера маршрута и названия аэропорта;
Сущность Категория направления. Содержит следующие атрибуты: Код
направления, название, стоимость за 1 км, ставка за рейс (необходима для расчета
заработной платы летчикам). Ключ – Код направления
Сущность Количество билетов. Содержит следующие атрибуты: код рейса,
дата, количество проданных билетов, сумма. Составной ключ: дата, код рейса.
3.4. Выявление и описание ограничений целостности
Под целостностью данных понимаются ссылочные ограничения, т.е. те
ограничения, которые нужно соблюдать для сохранения целостности связи между
таблицами, в случае если в них будут изменяться или удаляться записи.
Для обеспечения целостности данных в Access есть 4 варианта:
1. Если не указано каскадное обновление связей, то предотвращается
изменение значений первичного ключа в главной таблице, если существуют связанные
записи в подчиненной таблице.
2. Если указано каскадное обновление связей, то при изменении значений
первичного ключа будут изменяться соответствующие значения в связанной таблице.
3. Если не указано каскадное удаление связанных записей, то предотвращается
удаление связанных записей из главной таблицы, если имеются связанные с ней записи
в подчиненной.
4. Если указано каскадное удаление, то связанные записи подчиненной
таблицы удаляются автоматически.
В данном курсовом проекте у каждой связи установлены такие параметры как
каскадное обновление и каскадное удаление связей. Свойства этих параметров описаны
выше.
Также к ограничениям целостности можно отнести ограничения на столбец и на
таблицу, а точнее на значения данных в них. К таким ограничениям можно отнести
следующие:

Запрещение null значения: данные, заносимые в столбец или таблицу, не
должны равняться нулю.

Ограничения на допустимые значения полей: условие, которому должны
удовлетворять данные, вносимые в таблицу.

Ограничение первичного ключа: на практике рекомендуется для каждой
таблицы создавать первичный ключ, особенностью которого является не допуск null
значения.

Ограничение
(уникальных) данных.
уникальных
ключей:
необходимость
ввода
различных
В данном курсовом проекте используются следующие ограничения данных в
таблицах:
Таблица Летчики
В поле Дата рождения на данные накладывается ограничение от 01.01.1965 до
01.01.80.
Таблица Аэропорты
В поле Расстояние на данные накладывается ограничение >0.
Таблица Маршруты
В поле Код маршрута на данные накладывается ограничение 100.
Таблица Количество билетов
В поле Количество на данные накладывается ограничение >0.
Таблица Самолеты
В поле Количество мест на данные накладывается ограничение >10.
3.5. Разработка инфологической модели предметной области.
Инфологическая модель описывает предметную область на содержательном
уровне. Результатом этого анализа являются списки объектов предметной области,
перечни свойств, или атрибутов, определение связей между объектами и описание
структуры предметной области в виде диаграммы.
Определим
связи
данной
предметной
области
на
этапе
разработки
инфологической модели.
Связь между сущностями можно охарактеризовать степенью связи и классом
принадлежности сущности к связи. Где степень связи показывает, сколько экземпляров
одной сущности могут быть связано с каждым экземпляром другой сущности, и может
иметь три значения:
 Один к одному (1:1)
 Один ко многим (1:М или М:1)
 Многие ко многим (М:N)
Класс принадлежности сущности к связи может быть обязательным (каждый
экземпляр сущности обязательно должен быть связан с другой сущностью) и
необязательным (каждый экземпляр сущности не требует связи с экземпляром другой
сущности).
В данном курсовом проекте используются двухсторонние и трехсторонние
связи.
1)
Самолеты
Обслуж
и-вает
Летчики
Код летчика
Номер самолета
Рейс
Код рейса
В
случае
трехсторонней
связи
используется
четыре
предварительных
отношения, по одному для каждой сущности и одно для связи. Ключ каждой сущности
служит в качестве первичного ключа для соответствующего отношения. Отношение,
порождаемое связью, имеет среди своих атрибутов ключи от каждой сущности.
Первичный ключ для Обслуживает рейс будет определен при распределении
всех других атрибутов.
Рейс обслуживается Летчиком на Самолете - трехарная связь.
Класс принадлежности объектов Рейс, Летчик, Самолет – обязательный.
2)
Рейс
Маршрут
Относится к
Код рейса
Код маршрута
При двухсторонней связи требуется три предварительных отношения.
Рейс
относиться
к
такому-то
Маршруту
-
бинарная
связь.
Класс
принадлежности объектов Код рейса, Код маршрута – обязательный.
3)
Маршрут
Аэропорт
Имеет
Код маршрута
Название
Маршрут имеет такой-то Аэропорт - бинарная связь. Класс принадлежности
объектов Код маршрута, Название аэропорта – обязательный.
4) Маршрут имеет такую-то Категорию направление - бинарная связь. Класс
принадлежности объектов Код маршрута, код направления – обязательный.
Маршрут
Категория
направления
Имеет
Код маршрута
Код направления
5) По итогу Рейса продано столько-то Количества билетов - бинарная связь.
Класс принадлежности объекта Код рейса – обязательный.
Рейс
Код рейса
Продано по
дате
Количество
билетов
Количество
4. Проектирование даталогической модели БД
4.1.Выбор СУБД.
СУБД представляет собой совокупность языковых и программных средств, с
помощью которых база данных создается и поддерживается.
На данный момент
существует множество языков, с помощью которых можно создавать различные
структуры и вводить в них необходимые элементы управления. При выборе модели
данных мы остановились на реляционной модели из-за ее математической
определенности и наличия большого количества СУБД, которые поддерживают
реляционную модель данных. Из всего множества СУБД была выбрана MySQL
Workbench + MySQL Server 8.0.17 благодаря имеющимся средствам визуальной
разработки графического интерфейса и наличию удобной среды разработки
4.2.Отображение инфологической модели
на даталогическую модель
Даталогическая модель описывает объекты и связи предметной области на
формальном уровне. Ее разработка основывается на инфологической модели. В
процессе разработки осуществляется выбор модели данных, и определяются ее
элементы.
Учитывая выбранную СУБД и разработанную инфологическую модель
предметной области, была разработана следующая даталогическая модель:
Аэропорты (КодМарш, НазвАэропорта, Расстояние).
ДниНедели (Код дня, День недели).
ИтогиДня (КодРейса, Дата, ЧислоПроданБил, Сумма).
Маршрут (КодМарш, КонАэропорт, КодНапр).
ОбслужРейса (Дата,КодРейса, НомСам, КодЛетчика).
Проданные места (КодРейса, Дата, Место, Цена).
РасписаниеРейсов (КодРейса, КодМарш, ДеньНедели, ВрОтпр, ВрПриб).
Самолеты (НомСам, Поступил, ТребРемонт, ТипСам, КоличМест).
Летчики (КодЛетчика, Фамилия, Имя, Отчество, Паспорт, ДатаРожд).
СписокМест (Список80Места, Список50Места, Список60Места).
СтоимПоНапр (КодНапр, НаименНапр, СтоимЗа1км, СтавкаЗаРейс).
Таблица: Аэропорты
Имя поля
Тип данных
Обязательное
поле
Индексированное
поле
Условие
на
значение
КодМарш
Числовой
Да
Да(совпадения
допускаются)
НазвАэропорта
Текстовый
Да
Расстояние
Числовой
Да
Нет
>0
Таблица: ДниНедели
Имя поля
Тип
Обязательное
Индексированное
Условие на
данных
поле
поле
значение
КодДня
Числовой
Да
Да(совпадения не
допускаются)
ДеньНедели Текстовый
Да
Нет
Таблица: ИтогиДня
Имя поля
Тип
данных
Дата
Дата/время
КодРейса
Числовой
ЧислоПроданБил
Числовой
Сумма
Денежный
Таблица: Маршрут
Имя поля
Тип
данных
КодМарш
Числовой
КонАэропорт Текстовый
КодНапр
Числовой
Обязательное
поле
Да
Да
Да
Да
Индексированное
поле
Да(совпадения
допускаются)
Нет
Нет
Условие на
значение
>0
Обязательное поле
Индексированное поле
Да
Да
Да
Да(совпадения не допускаются)
Нет
Таблица: ОбслужРейса
Имя поля Тип данных Обязательное поле
Индексированное поле
Дата
Дата/Время
Да
КодРейса
Числовой
Да
Да (Совпадения допускаются)
НомСам
Текстовый
Да
КодЛетчика
Числовой
Да
Таблица: Проданные места
Имя
Тип
Обязательное
поля
данных
поле
КодРейса
Числовой
Да
Дата
Дата/Время
Да
Место
Числовой
Да
Цена
Денежный
Да
Таблица: РасписаниеРейсов
Имя поля
Тип
Обязательное
данных
поле
КодРейса
Счетчик
Да
КодМарш
Числовой
Да
ДеньНедели Числовой
Да
ВрОтпр
Текстовый
Да
Индексированное
поле
Да(совпадения
допускаются)
Нет
Нет
Условие на
значение
>0
Индексированное поле
Да(совпадения не допускаются)
Да(совпадения допускаются)
Нет
Нет
ВрПриб
Текстовый
Таблица: Самолеты
Имя поля
Тип данных
Да
НомСам
Текстовый
Обязательное
поле
Да
Поступл
ТребРемонт
ТипСам
КоличМест
Дата/Время
Логический
Текстовый
Числовой
Да
Да
Да
Да
Таблица: Сведения о летчиках
Имя поля
Тип
Обязательное
данных
поле
КодЛетчика
Счетчик
Да
Фамилия
Имя
Отчество
Паспорт
Текстовый
Текстовый
Текстовый
Текстовый
Да
Да
Да
Да
ДатаРожд
Дата/Время
Да
Нет
Индексированное
поле
Да(допускаются не
совпадения)
Нет
Нет
Нет
Нет
Индексированное
поле
Да(совпадения не
допускаются)
Нет
Нет
Нет
Да(совпадения не
допускаются)
Нет
Условие на
значение
>10
Условие на
значение
≥#01.01.1965#
And <#01.01.80#
Таблица: СтоимПоНапр
Имя поля
Тип данных Обязательное поле
Индексированное поле
КодНапр
Счетчик
Да
Да(совпадения не допускаются)
НаименНапр
Текстовый
Да
СтоимЗа 1 км Денежный
Да
Нет
СтавкаЗаРейс Денежный
Да
Нет
Схема даталогической модели базы данных (схема данных).
5. Реализация БД
5.1.Разработка средств реализации ограничений целостности
В любой момент времени БД имеет некоторую определенную конфигурацию
значений данных, которые отражают действительность, т.е. являются частью реального
мира. Просто определить конфигурацию значений не имеет смысла без связи с
внешним миром. Поэтому требуется уточнить определение БД, включив в него правила
целостности, которые необходимы для информирования СУБД о различного рода
ограничениях реального мира с целью не допустить “ абсурдных ” значений данных.
Для любого отношения можно создать ряд правил - ограничений. Каждая
конкретная БД должна иметь свои ограничения, связанные с предметной областью,
которые
накладываются на хранящиеся в ней данные. К таким ограничениям
целостности относятся:
1. Ограничения на атрибуты (тип атрибута, диапазон допустимых значений).
2.
Число кортежей отношения должно быть равно числу первичных ключей
(наличие кортежей –дубликатов не допускается).
Первое ограничение накладывается на атрибуты всех отношений на этапе
определения типа атрибута. Кроме этого некоторые поля таблиц имеют условие на
значение, например, в отношении Летчики атрибут ДатаРожд должен быть в
интервале от 01.01.1965 до 01.01.80.
Второе ограничение накладывается на отношения на этапе заполнения таблиц
данными о БД.
Существует
также
два
общих
правила
целостности.
Они
касаются
потенциальных и внешних ключей:
1. Первичный ключ является уникальным идентификатором отношения. Не
допускается, чтобы какой-либо атрибут, участвующий в первичном ключе, принимал
неопределенное значение. В отношении не может быть несколько кортежей с
одинаковыми значениями первичного ключа.
Например, в отношении ДниНедели не может существовать несколько
кортежей с одинаковыми значениями атрибута КодДня,
2.
Потенциальный ключ отношения не может иметь пустого значения
(NULL). Так как объект, не имеющий идентичности, не существует.
3. Если r2 – некоторое отношение с внешним ключом X , то
существовать такое базовое
должно
отношение r1 с первичным ключом K , что каждое
значение X в r2 совпадает со значением К в каком-либо кортеже отношения r1.
В процессе создания БД сначала осуществляется конструирование таблиц, далее
создается схема данных, в которой фиксируются связи между таблицами. В этой схеме
могут быть заданы параметры обеспечения целостности базы данных, если модель
была разработана в соответствии с требованиями нормализации. Целостность данных
означает, что в БД установлены и корректно поддерживаются взаимосвязи между
записями разных таблиц при их загрузке, добавлении и удалении в связанных таблицах,
а также при изменении значений ключевых полей.
Например, при удалении записи из таблицы Самолеты удаляются все связанные
с ней записи в подчиненных таблицах.
5.2 Настройка групп пользователей
Пользователей можно добавлять двумя различными способами - при помощи
команды GRANT или
напрямую
в
таблицы
назначения
привилегий
MySQL.
Предпочтительнее использовать команду GRANT - этот способ проще и дает меньше
ошибок. See section
Существует также большое количество программ (таких как phpmyadmin),
которые служат для создания и администрирования пользователей. @xref{Portals}.
В
приведенных
ниже
примерах
демонстрируется,
как
использовать
клиент mysql для задания новых пользователей. В примерах предполагается, что
привилегии установлены в соответствии с принятыми по умолчанию значениями,
описанными в предыдущем разделе. Это означает, что для внесения изменений на том
же компьютере, где запущен mysqld, необходимо подсоединиться к серверу как
пользователь MySQL root, и у пользователя root должна быть привилегия INSERT для
базы данных mysql, а также административная привилегия RELOAD. Кроме того, если
был
изменен
пароль
пользователя root,
его
необходимо
указать
команды mysql.
Новых пользователей можно добавлять, используя команду GRANT:
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO engineer@localhost
->
IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO engineer@"%"
-> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO local_worker@localhost;
Эти команды GRANT создают трех новых пользователей:
здесь
для
engineer
Полноценный суперпользователь - он может подсоединяться к серверу
откуда угодно, но должен использовать для этого пароль some_pass. Обратите
внимание
на
то,
что
мы
должны
применить
операторы GRANT как
для engineer@localhost, так и для engineer@"%". Если не добавить запись
с localhost, запись анонимного пользователя для localhost, которая создается при
помощи mysql_install_db, будет иметь преимущество при подсоединении с
локального компьютера, так как в ней указано более определенное значение для
поля Host, и она расположена раньше в таблице user.
admin
Пользователь, который может подсоединяться с localhost без пароля; ему
назначены административные привилегии RELOAD и PROCESS.
Эти привилегии позволяют пользователю запускать команды mysqladmin
reload, mysqladmin refresh и mysqladmin flush-*, а также mysqladmin processlist.
Ему не назначено никаких привилегий, относящихся к базам данных (их можно
назначить позже, дополнительно применив оператор GRANT).
local_worker
Пользователь, который может подсоединяться к серверу без пароля, но
только с локального компьютера. Все глобальные привилегии установлены в
значение 'N'-тип
привилегии USAGE,
который
позволяет
создавать
пользователей без привилегий. Предполагается, что относящиеся к базам
данных привилегии будут назначены позже.
Можно напрямую добавить точно такую же информацию о пользователе
при помощи оператора INSERT, а затем дать серверу команду перезагрузить
таблицы назначения привилегий:
shell> mysql --user=root mysql
mysql>
INSERT
INTO
user
VALUES('localhost','engineer',PASSWORD('some_pass'),
->
mysql>
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
INSERT
INTO
VALUES('%','engineer',PASSWORD('some_pass'),
->
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
->
Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
user
->
VALUES('localhost','local_worker','');
mysql> FLUSH PRIVILEGES;
В зависимости от версии MySQL в примере, приведенном выше, может
указываться различное количество значений 'Y' (в версиях до Version 3.22.11 было
меньше
столбцов
привилегий).
Для
пользователя admin используется
более
удобочитаемый расширенный синтаксис команды INSERT, который доступен начиная
с версии 3.22.11.
Обратите внимание: чтобы создать суперпользователя, необходимо создать
запись таблицы user с полями привилегий, установленными в значение 'Y'. Нет
необходимости задавать значения в записях таблиц db или host.
Столбцы привилегий в таблице user в последнем операторе INSERT (для
пользователя local_worker) не были заданы явно, поэтому данным столбцам был
присвоено
принятое
по
умолчанию
значение 'N'.
Точно
так
же
действует
команда GRANT USAGE.
В приведенном ниже примере добавляется пользователь custom, который может
подсоединяться с компьютеров localhost, server.domain и whitehouse.gov. Он хочет
получать доступ к базе данных bankaccount только с компьютера localhost, к базе
данных expenses - только с whitehouse.gov, и к базе данных customer - со всех трех
компьютеров, а также использовать пароль 1234567890 при подсоединении со всех
трех компьютеров.
Чтобы задать эти привилегии пользователя при помощи оператора GRANT,
выполните следующие команды:
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
->
ON bankaccount.*
->
TO custom@localhost
->
IDENTIFIED BY '1234567890';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
->
ON expenses.*
->
TO custom@whitehouse.gov
->
IDENTIFIED BY '1234567890';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
->
ON customer.*
->
TO custom@'%'
->
IDENTIFIED BY '1234567890';
Привилегии для пользователя custom мы назначаем потому, что этот
пользователь хочет получать доступ к MySQL как с локального компьютера
через сокеты Unix, так и с удаленного компьютера whitehouse.gov через
протокол TCP/IP.
Чтобы
задать
привилегии
пользователя
путем
непосредственного
внесения изменений в таблицы назначения привилегий, выполните следующие
команды (обратите внимание на команду FLUSH PRIVILEGES в конце
примера):
shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('localhost','custom',PASSWORD('1234567890'));
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('server.domain','custom',PASSWORD('1234567890'));
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('whitehouse.gov','custom',PASSWORD('1234567890'));
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES
-> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES
-> ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
Первые три оператора INSERT добавляют в таблицу user записи, которые
позволят пользователю custom подключаться с различных компьютеров с
указанным паролем, но не дают ему никаких привилегий (все привилегии
установлены в принятое по умолчанию значение 'N'). Следующие три
оператора INSERT добавляют записи в таблицу db, в которой назначаются
привилегии
для
пользователя custom по
отношению
к
базам
данных bankaccount, expenses и customer, но только если доступ осуществляется с
определенных компьютеров. Как обычно, после внесения изменений непосредственно в
таблицы назначения привилегий серверу необходимо дать команду на перезагрузку
этих таблиц (при помощи FLUSH PRIVILEGES), чтобы внесенные изменения вступили
в силу.
Если необходимо предоставить определенному пользователю доступ с любого
компьютера
к
определенному
домену,
можно
воспользоваться
оператором GRANT следующим образом:
mysql> GRANT ...
->
ON *.*
->
TO myusername@"%.mydomainname.com"
->
IDENTIFIED BY 'mypassword';
Чтобы сделать то же самое путем непосредственного внесения изменений в
таблицы назначения привилегий, выполните следующие действия:
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
->
PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;
Можно также воспользоваться программами xmysqladmin, mysql_webadmin и
даже xmysql, чтобы вставить, обновить или изменить значения в таблицах назначения
привилегий. Эти утилиты можно найти в каталоге Contrib веб-сайта MySQL.
5.3.Разработка процедур ведения БД
(добавление, удаление, изменение, контроль)
В данном проекте созданы следующие запросы:
Запрос на удаление УдалениеВременныхДанных:
DELETE ИтогиДня.Дата, ИтогиДня.КодРейса, ИтогиДня.ЧислоПроданБил,
ИтогиДня.Сумма
FROM ИтогиДня;
Запрос на добавление ПриобретМеста:
INSERT INTO [Проданные места] ( КодРейса, Дата, Место, Цена )
SELECT
Forms!Билет4!Рейс
AS
Рейс,
Forms!Билет4!Дата
AS
дата,
Forms!Билет4!Место AS место, Forms!Билет4!Цена AS цена;
Запрос на добавление Подсчет(Мест/Суммы):
INSERT INTO ИтогиДня ( КодРейса, Дата, ЧислоПроданБил, Сумма )
SELECT
[Проданные
места].КодРейса,
[Проданные
места].Дата,
Count([Проданные места].Место) AS [Count-Место], Sum([Проданные места].Цена) AS
[Sum-Цена]
FROM [Проданные места]
GROUP BY [Проданные места].КодРейса, [Проданные места].Дата;
5.4.Разработка процедур реализации запросов и интерфейса
пользователя.
Для получения нужной информации необходимо объединять исходные
отношения. Связывание исходных отношений осуществляется при помощи запросов,
создаваемых мастером и дорабатываемых вручную до получения требуемого
результата. Запросы описаны при помощи встроенного языка запросов SQL.
В данном проекте созданы следующие запросы:
ВидСамолета. Запрос для получения количества мест в самолете в
определенный
день
и
рейс.
Связывает
отношения
РасписаниеРейсов,
ОбслуживаниеРейсов, Самолеты.
SELECT РасписаниеРейсов.КодРейса, ОбслужРейса.Дата,
РасписаниеРейсов.ВрОтпр, Самолеты.КоличМест AS КоличМест,
Самолеты.ТипСам
FROM РасписаниеРейсов INNER JOIN (Самолеты INNER JOIN
ОбслужРейса ON Самолеты.НомСам=ОбслужРейса.НомСам) ON
РасписаниеРейсов.КодРейса=ОбслужРейса.КодРейса
GROUP BY РасписаниеРейсов.КодРейса, ОбслужРейса.Дата,
РасписаниеРейсов.ВрОтпр, Самолеты.ТипСам
HAVING (((РасписаниеРейсов.КодРейса)=Forms!Билет2!ПолеСоСписком31)
And ((ОбслужРейса.Дата)=Forms!Билет1!Поле16));
ВрДвижРейса. Запрос, определяющий время отправления и прибытия
каждого рейса.
SELECT РасписаниеРейсов.ВрОтпр AS часы, РасписаниеРейсов.ВрПриб
AS врдвиж
FROM РасписаниеРейсов
WHERE(((РасписаниеРейсов.КодРейса)=[Forms]![Изменение
ОбслуживаниеРейса]![КодРейса]));
Время отправл. Запрос используется для получения расписания движения
самолетов в определенный день и по определенному маршруту (дата и пункт
назначения вводятся в форме “Билет1”, при этом получаем, кроме расписания, и
количество мест в самолете. Запрос связывает отношения РасписаниеРейсов,
Аэропорты, Самолеты.
SELECT
РасписаниеРейсов.КодМарш,
РасписаниеРейсов.ВрОтпр,
РасписаниеРейсов.КодРейса,
Аэропорты.НазвАэропорта,
Самолеты.КоличМест,
ОбслужРейса.Дата
FROM (ДниНедели INNER JOIN (Аэропорты INNER JOIN РасписаниеРейсов
ON Аэропорты.КодМарш = РасписаниеРейсов.КодМарш) ON ДниНедели.КодДня =
РасписаниеРейсов.ДеньНедели) INNER JOIN (Самолеты INNER JOIN ОбслужРейса ON
Самолеты.НомСам = ОбслужРейса.НомСам) ON РасписаниеРейсов.КодРейса =
ОбслужРейса.КодРейса
WHERE
(((Аэропорты.НазвАэропорта)=[Forms]![Билет1]![ПолеСоСписком0]) AND
((ОбслужРейса.Дата)=[Forms]![Билет1]![Поле16]) AND
((РасписаниеРейсов.ДеньНедели)=Weekday([Forms]![Билет1]![Поле16])))
ORDER BY РасписаниеРейсов.ВрОтпр;
ВсеМеста. Запрос для получения списка всех мест в самолете в определенный
день и рейс.
SELECT IIf(ВидСамолета!КоличМест=80,[Список
мест]!список80места,IIf(ВидСамолета!КоличМест=60,[Список
мест]!список60места,[Список мест]!список50места)) AS Место
FROM [Список мест], ВидСамолета
WHERE (((IIf([ВидСамолета]![КоличМест]=80,[Список
мест]![список80места],IIf([ВидСамолета]![КоличМест]=60,[Список
мест]![список60места],[Список мест]![список50места]))) Is Not Null));
Занятые места. Запрос для получения списка занятых мест по
конкретному рейсу в определенный день.
SELECT
[Проданные
места].Место,
[Проданные
места].КодРейса,
[Проданные места].Дата
FROM [Проданные места]
WHERE ((([Проданные места].КодРейса) =
[Forms]![Билет2]![ПолеСоСписком31]) AND (([Проданные места].Дата) =
[Forms]![Билет1]![Поле16]));
ИтогиРейса. Запрос для получения количества проданных билетов и суммы в
определенный день.
SELECT ИтогиДня.Дата, РасписаниеРейсов.КодМарш, Маршрут.КонАэропорт,
РасписаниеРейсов.ВрОтпр,
ИтогиДня.ЧислоПроданБил,
ИтогиДня.Сумма,
РасписаниеРейсов.КодРейса
FROM (Маршрут INNER JOIN РасписаниеРейсов ON Маршрут.КодМарш =
РасписаниеРейсов.КодМарш) INNER JOIN ИтогиДня ON РасписаниеРейсов.КодРейса
= ИтогиДня.КодРейса
WHERE (((ИтогиДня.Дата)=[Forms]![ВводДаты]![ПолеСоСписком1]));
ОбслуживаниеРейса. Какие летчики (ФИО),самолеты обслуживают рейс и в
какое время.
SELECT [Сведения о летчиках].КодЛетчика, [Сведения о летчиках].Фамилия,
[Сведения о летчиках].Имя, [Сведения о летчиках].Отчество, ОбслужРейса.Дата,
РасписаниеРейсов.ВрОтпр,
ОбслужРейса.КодРейса,
РасписаниеРейсов.КодМарш,
Маршрут.КонАэропорт, ОбслужРейса.НомСам
FROM [Сведения о летчиках] INNER JOIN ((Маршрут INNER JOIN
РасписаниеРейсов ON Маршрут.КодМарш = РасписаниеРейсов.КодМарш) INNER
JOIN ОбслужРейса ON РасписаниеРейсов.КодРейса = ОбслужРейса.КодРейса) ON
[Сведения о летчиках].КодЛетчика = ОбслужРейса.КодЛетчика
GROUP BY [Сведения о летчиках].КодЛетчика, [Сведения о летчиках].Фамилия,
[Сведения о летчиках].Имя, [Сведения о летчиках].Отчество, ОбслужРейса.Дата,
РасписаниеРейсов.ВрОтпр,
ОбслужРейса.КодРейса,
РасписаниеРейсов.КодМарш,
Маршрут.КонАэропорт, ОбслужРейса.НомСам
ORDER BY ОбслужРейса.Дата;
ПоВрДвиж. Запрос, определяющий список самолетов и летчиков, совершающих
рейс в момент вылета очередного (требующего введения сведений об обслуживании)
SELECT ОбслужРейса.КодЛетчика, [Сведения о летчиках].Фамилия, [Сведения
о
летчиках].Имя,
[Сведения
о
летчиках].Отчество,
Самолеты.НомСам,
ОбслужРейса.Дата, РасписаниеРейсов.ВрОтпр, РасписаниеРейсов.ВрПриб
FROM [Сведения о летчиках] INNER JOIN ((Маршрут INNER JOIN
РасписаниеРейсов ON Маршрут.КодМарш = РасписаниеРейсов.КодМарш) INNER
JOIN
(Самолеты
INNER
JOIN
ОбслужРейса
ON
Самолеты.НомСам
=
ОбслужРейса.НомСам) ON РасписаниеРейсов.КодРейса = ОбслужРейса.КодРейса) ON
[Сведения о летчиках].КодЛетчика = ОбслужРейса.КодЛетчика
WHERE (((ОбслужРейса.Дата)=[Forms]![Изменение
ОбслуживаниеРейса]![Дата]) AND
((РасписаниеРейсов.ВрПриб)>(select[часы]from[ВрДвижРейса])));
ПолнаяСтоим. Вывод стоимости билетов для всех рейсов и всех типов билета.
SELECT Аэропорты.НазвАэропорта, РасписаниеРейсов.КодРейса, Int([Стоим За
1км]*[Аэропорты].[Расстояние]) AS 1кл, Int([1кл]*0.75) AS 2кл, Int([1кл]*0.52) AS
д1кл, Int([д1кл]*0.75) AS д2кл
FROM СтоимПоНапр INNER JOIN ((Маршрут INNER JOIN Аэропорты ON
Маршрут.КодМарш = Аэропорты.КодМарш) INNER JOIN РасписаниеРейсов ON
Маршрут.КодМарш = РасписаниеРейсов.КодМарш) ON СтоимПоНапр.КодНапр =
Маршрут.КодНапр;
ПоНачалуДвиж.
Запрос,
определяющий
список
летчиков
и
самолетов,
совершающих рейс до момента прибытия очередного (требующего введения сведений
об обслуживании).
SELECT ОбслужРейса.КодЛетчика, [Сведения о летчиках].Фамилия, [Сведения
о
летчиках].Имя,
Самолеты.НомСам,
[Сведения
о
летчиках].Отчество,
ОбслужРейса.Дата, РасписаниеРейсов.ВрОтпр, РасписаниеРейсов.ВрПриб
FROM [Сведения о летчиках] INNER JOIN ((Маршрут INNER JOIN
РасписаниеРейсов ON Маршрут.КодМарш = РасписаниеРейсов.КодМарш) INNER
JOIN
(Самолеты
INNER
JOIN
ОбслужРейса
ON
Самолеты.НомСам
=
ОбслужРейса.НомСам) ON РасписаниеРейсов.КодРейса = ОбслужРейса.КодРейса) ON
[Сведения о летчиках].КодЛетчика = ОбслужРейса.КодЛетчика
WHERE (((ОбслужРейса.Дата)=[Forms]![Изменение
ОбслуживаниеРейса]![Дата]) AND ((РасписаниеРейсов.ВрОтпр)<(select
[врдвиж]from[ВрДвижРейса])));
СвобЛет. Запрос для получения списка тех летчиков, которые фактически могут
обслужить данный рейс.
SELECT [Сведения о летчиках].КодЛетчика, [Сведения о летчиках].Фамилия,
[Сведения о летчиках].Имя, [Сведения о летчиках].Отчество
FROM [Сведения о летчиках]
WHERE ((([Сведения о летчиках].КодЛетчика) Not In (select [КодЛетчика] from
[ПоВрДвиж]))) OR ((([Сведения о летчиках].КодЛетчика) Not In (select [КодЛетчика]
from [ПоНачалуДвиж] )));
Свободные
места.
Запрос
для
получения
списка
свободных
мест
в
определенный день и рейс (для ввода номера места в билете).
SELECT ВсеМеста.Место
FROM ВсеМеста
WHERE Not Exists (select [Занятые места].[Место] from [Занятые места] where
[Занятые места].[Место]=[ВсеМеста].[Место]);
СвобСам. Запрос для получения списка самолетов, которые фактически могут
обслужить данный рейс.
SELECT Самолеты.НомСам, Самолеты.ТребРемонт
FROM Самолеты
WHERE (((Самолеты.НомСам) Not In (select [НомСам] from [ПоВрДвиж])) AND
((Самолеты.ТребРемонт)=False)) OR (((Самолеты.НомСам) Not In (select [НомСам]
from [ПоНачалуДвиж] )) AND ((Самолеты.ТребРемонт)=False));
СтавкаЗаРейс (все). Запрос для получения заработной платы всех летчиков за
определенный месяц.
SELECT
ОбслужРейса.КодЛетчика,
Аэропорты.НазвАэропорта,
ОбслужРейса.Дата,
[СтавкаЗаРейс]*[Расстояние]
AS
СуммаЗаРейс,
Month([Дата]) AS Месяц, [Сведения о летчиках].Фамилия, [Сведения о летчиках].Имя,
[Сведения о летчиках].Отчество, Аэропорты.Расстояние, РасписаниеРейсов.ВрОтпр
FROM СтоимПоНапр INNER JOIN ([Сведения о летчиках] INNER JOIN
(((Маршрут INNER JOIN Аэропорты ON Маршрут.КодМарш = Аэропорты.КодМарш)
INNER
JOIN
РасписаниеРейсов
РасписаниеРейсов.КодМарш)
РасписаниеРейсов.КодРейса
INNER
=
ON
Маршрут.КодМарш
JOIN
ОбслужРейса
ОбслужРейса.КодРейса)
ON
=
ON
[Сведения
о
летчиках].КодЛетчика = ОбслужРейса.КодЛетчика) ON СтоимПоНапр.КодНапр =
Маршрут.КодНапр
WHERE (((Month([Дата]))=[Forms]![Выбор месяца]![ПолеСоСписком1]));
СтавкаЗаРейсЛетч. Запрос для получения заработной платы определенного
летчика за определенный день.
SELECT [Сведения о летчиках].Фамилия, [Сведения о летчиках].Имя, [Сведения
о
летчиках].Отчество,
Аэропорты.НазвАэропорта,
ОбслужРейса.КодЛетчика,
Аэропорты.Расстояние,
ОбслужРейса.Дата,
Month([Дата])
AS
11,
[СтавкаЗаРейс]*[Расстояние] AS СуммаЗаРейс, РасписаниеРейсов.ВрОтпр
FROM СтоимПоНапр INNER JOIN ([Сведения о летчиках] INNER JOIN
(((Маршрут INNER JOIN Аэропорты ON Маршрут.КодМарш = Аэропорты.КодМарш)
INNER
JOIN
РасписаниеРейсов
РасписаниеРейсов.КодМарш)
РасписаниеРейсов.КодРейса
INNER
=
ON
Маршрут.КодМарш
JOIN
ОбслужРейса
ОбслужРейса.КодРейса)
ON
[Сведения
=
ON
о
летчиках].КодЛетчика = ОбслужРейса.КодЛетчика) ON СтоимПоНапр.КодНапр =
Маршрут.КодНапр
WHERE (((ОбслужРейса.КодЛетчика)=[Forms]![Сведения о
летчиках]![КодЛетчика]) AND
((Month([Дата]))=[Forms]![ВыборМесЛетч]![ПолеСоСписком1]));
Стоимость. Запрос для получения стоимости билета для всех видов билета по
определенному маршруту. Связывает отношения Аэропорты, СтоимостьПоНапр,
Маршрут.
SELECT
Аэропорты.НазвАэропорта,
Аэропорты.Расстояние,
СтоимПоНапр.[Стоим За 1км], Int([Стоим За 1км]*[Аэропорты].[Расстояние]) AS 1кл,
Int([1кл]*0.75) AS 2кл, Int([1кл]*0.52) AS д1кл, Int([д1кл]*0.75) AS д2кл
FROM СтоимПоНапр INNER JOIN (Маршрут INNER JOIN Аэропорты ON
Маршрут.КодМарш
=
Аэропорты.КодМарш)
ON
СтоимПоНапр.КодНапр
Маршрут.КодНапр
WHERE (((Аэропорты.НазвАэропорта)=[Forms]![Билет1]![ПолеСоСписком0]));
=
6. Спецификация входных и выходных запросов.
Основной и единственный
исполняемый модуль программы Аэропорт.mdb.
Этот модуль содержит таблицы данных, запросы к данным, формы ввода-вывода.
Раздел таблицы данных включает в себя данные предметной области, хранимые
в виде отдельных таблиц:
Таблица: Аэропорты
Таблица: ДниНедели
Таблица: ИтогиДня
Таблица: Маршрут
Таблица: ОбслужРейса
Таблица: Проданные места
Таблица: РасписаниеРейсов
Таблица: Самолеты
Таблица: Сведения о летчиках
Таблица: Список мест
Таблица: СтоимПоНапр
7.Спецификация запросов пользователей
Для доступа к определенным атрибутам отношений (полям таблицы)
используются запросы, которые расположены в разделе запросов:
Запрос: ВидСамолета
Запрос: ВрДвижРейса
Запрос: Время отправл
Запрос: ВсеМеста
Запрос: Занятые места
Запрос: ИтогиРейса
Запрос: ОбслуживаниеРейса
Запрос: ПоВрДвиж
Запрос: Подсчет (Мест/Суммы)
Запрос: ПолнаяСтоим
Запрос: ПоНачалуДвиж
Запрос: ПриобретМеста
Запрос: СвобЛет
Запрос: Свободные места
Запрос: СвобСам
Запрос: СиавкаЗаРейс (все)
Запрос: СтавкаЗаРейсЛетч
Запрос: Стоимость
Запрос: УдалениеВременДанных
Заключение
В ходе выполнения работы было выполнено проектирование базы данных, её
создание а также создание групп пользователей с различными правами доступа. Данная
база данных в дальнейшем может быть использована для более сложных проектов и
при необходимой доработке использоваться в последующих проектах.
Список используемой литературы
1.Голицина О.Л., Максимов Н.В., Попов И.И. Базы данных: Учебное пособие. – М:
ФОРУМ: ИНФРА-М, 2004
2.Кузин А.В,, Демин В.М. Разработка баз данных в системе Microsoft Access:
Учебник. – М.: ФОРУМ: ИНФРА-М, 2005
3.Фуфаев Э.В. Базы данных: Учебное пособие для студентов СПО/ Э.В. Фуфаев,
Д.Э. Фуфаев. – Издательский центр «Академия», 2005
4.Проектирование баз данных. СУБД: Учебное пособие для вузов/Н.Н. Гринченко,
Е.В. Гусев, Н.П. Макаров, А.Н. Пылькин, Н.И. Цуканова. – М.: Горячая линия –
Телеком, 2004
5.Рудикова Л.В. Базы данных. Разработка приложений. – СПб.: БХВ-Петербург,
Download