
- •Содержание
- •Введение
- •Анализ разрешений и запретов на операции с табличными данными для различных пользователей.
- •1 Системный анализ предметной области
- •1.2 Описание предметной области
- •1.2 Описание входных документов для заполнения бд
- •1.3 Определение пользователей
- •1.4 Определение запросов
- •1.5 Определение выходных документов
- •Анализ сущностей и связей между ними: er–диаграмма
- •Нормализация отношений: схема бд
- •Запросы
- •5 Анализ разрешений и запретов на операции с табличными данными для различных пользователей
- •6 Проектирование пользовательского интерфейса
- •6.1 Реализация всех запросов через вызовы хранимых процедур
- •6.2 Хранимые процедуры для выдачи требуемых разрешений каждому пользователю
- •6.3 Триггеры для работы пользователей с таблицами базы данных
- •7 Обработка и визуализация данных
- •7.1 Обработка и визуализация данных инструментами языка программирования Python
- •7.2 Визуализация данных программными инструментами Excel
- •Заключение
- •Список использованных источников
- •Приложение а Листинг создания таблиц
- •Приложение б Листинг добавление данных в таблицы
- •Приложение в Скриншоты заполненных таблиц в бд
Нормализация отношений: схема бд
По определению компании Microsoft «нормализация – это процесс организации данных в базе данных, включающий создание таблиц и установление отношений между ними в соответствии с правилами, которые обеспечивают защиту данных и делают базу данных более гибкой, устраняя избыточность и несогласованные зависимости»
Основные правила нормализации:
Правило 1. Каждое поле таблицы должно представлять уникальный тип информации. Избавиться от повторяющихся полей (столбов) и разделить составные поля.
Правило 2. Каждая таблица должна иметь первичный ключ.
Правило 3. В таблице не должно быть данных, не относящихся к объекту, определяемому первичным ключом.
Правило 4. Независимость полей, т. е. возможность изменять значения любого поля (не входящего в первичный ключ) без воздействия на данные других полей.
Если выполняются одновременно три первых правила, считают, что база данных представлена в «третьей нормальной форме».
Был составлен список связей таблиц, который представлен в таблице №18.
Таблица 18. Список связей таблиц
№ |
Название связи |
Сущности, участвующие в связи |
Назначение |
1 |
1:М |
Пассажиры-Билет |
У каждого пассажира может быть несколько билетов, но каждый билет принадлежит только одному пассажиру. |
2 |
1:М |
Места-Билет |
Каждое место может быть указано на нескольких билетах, но на каждом билете указано только одно место. |
3 |
1:М |
Рейс-Билет |
Каждый рейс может иметь несколько билетов, но каждый билет соответствует только одному рейсу. |
4 |
1:М |
Авиакомпания-Рейс |
Каждая авиакомпания может выполнять несколько рейсов, но каждый рейс принадлежит только одной авиакомпании. |
5 |
1:М |
Самолет-Авиакомпания |
Каждый самолет может принадлежать только одной авиакомпании, но у каждой авиакомпании может быть несколько самолетов. |
6 |
1:М |
Экипаж-Сотрудники |
У каждого экипажа может быть несколько сотрудников, но каждый сотрудник может быть членом только одного экипажа. |
7 |
1:М |
Экипаж-Рейс |
Каждый экипаж может выполнять несколько рейсов, но каждый рейс может иметь только один экипаж. |
Была построена схема данных базы данных, которая представлена на рисунке 2.
Рисунок 2 - Схема данных
Все отношения (соответствующие сущностям) в предварительной схеме данных были приведены к третьей нормальной форме.
Запросы
В среде MySQL Workbench была создана база данных, а также описанные выше таблицы с атрибутами, в каждую таблицу были введены данные. Создание базы данных представлено в листинге 1. Создание таблиц представлено в приложении А. Добавление данных в таблице представлено в приложении Б. Скриншоты заполненных таблиц в БД представлены в приложении В.
Листинг 1 – Создание базы данных
create database аэропорт;
Были написаны запросы, которые могут быть полезны работы с данными.
Запрос 1. Выводит информацию о пассажирах по данному рейсу. Запрос 1 представлен в листинге 2. Можно заменить "Рейс" на любой другой, по которому хотим получить информацию. Этот запрос использует оператор JOIN для объединения данных из таблиц "Пассажиры" и "Билет" на основе общего атрибута "№ Пассажира", а затем фильтрует результаты, чтобы показать только те строки, в которых атрибут "Рейс" соответствуют указанному значению. Результат выполнения запроса представлен на рисунке 3.
Листинг 2 – Запрос 1
SELECT `пассажиры`.`№ Пассажира`, `пассажиры`.`Ф.И.О.`
FROM `пассажиры`
JOIN `билет` ON `пассажиры`.`№ Пассажира` = `билет`.`№ Пассажира`
WHERE `билет`.`№ Рейса` = 2;
Рисунок 3 - Результат выполнения запроса 1
Запрос 2 выводит список самолетов по годам выпуска в заданном интервале конкретной авиакомпании. Запрос 2 представлен в листинге 3. Можно заменить "Название авиакомпании" на любую другую, по которому хотим получить информацию. Этот запрос использует оператор JOIN для объединения данных из таблиц "Авиакомпания" и "Самолет" на основе общего атрибута "№ Самолета", а затем фильтрует результаты, чтобы показать только те строки, в которых атрибут "Название авиакомпании" соответствуют указанному значению, также добавлено условие определенного временного интервала с помощью оператора WHERE. Результат выполнения запроса представлен на рисунке 4.
Листинг 3 – Запрос 2
SELECT `самолет`.`Тип самолета`, `самолет`.`Год выпуска`
FROM `самолет`
JOIN `авиакомпания` ON `самолет`.`№ Самолета` = `авиакомпания`.`№ самолета`
WHERE `авиакомпания`.`Название авиакомпании` = 'Нарутотревел'
AND `самолет`.`Год выпуска` BETWEEN 2011 AND 2020;
Рисунок 4 - Результат выполнения запроса 2
Запрос 3 выводит список экипажа на данный рейс. Запрос 3 представлен в листинге 4. Этот запрос использует оператор JOIN для объединения данных из таблиц "Сотрудники", "Рейс" на основе их общих атрибутов "№ Экипажа" и "Код товара" соответственно, фильтрует данные по атрибуту "Рейс ". Результат выполнения запроса представлен на рисунке 5.
Листинг 4 – Запрос 3
SELECT `сотрудники`.`№ Экипажа`, `сотрудники`.`Ф.И.О.`, `сотрудники`.`Должность`
FROM `сотрудники`
JOIN `рейс` ON `сотрудники`.`№ Экипажа` = `рейс`.`№ Экипажа`
WHERE `рейс`.`№ Рейс` = 1;
Рисунок 5 - Результат выполнения запроса 3
Запрос 4 показывает проданные билеты по каждой авиакомпании за определенный период. Запрос 4 представлен в листинге 5. Этот запрос использует оператор JOIN для объединения данных из таблиц "Авиакомпания" и "Билет" на основе общего атрибута "№ Авиакомпании", а затем фильтрует результаты, чтобы показать только те строки, которые соответствуют определенному временному интервалу с помощью оператора WHERE, а затем группирует результаты по атрибуту «Название авиакомпании". Результат выполнения запроса представлен на рисунке 6.
Листинг 5 – Запрос 4
SELECT `авиакомпания`.`Название авиакомпании`, COUNT(`билет`.`№ Билет`) AS `Количество билетов`
FROM `билет`
JOIN `рейс` ON `билет`.`№ Рейса` = `рейс`.`№ Рейс`
JOIN `авиакомпания` ON `рейс`.`№ авиакомпании` = `авиакомпания`.`№ Авиакомпании`
WHERE `билет`.`Дата приобретения` BETWEEN '2022-01-05' AND '2022-10-05'
GROUP BY `авиакомпания`.`Название авиакомпании`;
Рисунок 6 - Результат выполнения запроса 4
Запрос 5 выводит забронированные места на пассажира. Запрос 5 представлен в листинге 6. Этот запрос использует оператор JOIN для объединения данных из таблиц "Билет" и "Места" на основе их общих атрибута "№ Места", а затем фильтрует данные с помощью оператора WHERE по заполненным. Результат выполнения запроса представлен на рисунке 7.
Листинг 6 – Запрос 5
SELECT `билет`.`№ Места`, `билет`.`Дата бронирования`, `места`.`Класс`
FROM `билет`
JOIN `места` ON `билет`.`№ Места` = `места`.`№ Места`
WHERE `билет`.`Дата бронирования` IS NOT NULL;
Рисунок 7 - Результат выполнения запроса 5
Запрос 6 выводит информацию о рейсах в данный пункт назначения. Запрос 6 представлен в листинге 7. Этот запрос использует таблицу "Рейс". Если вам нужно получить только определенные столбцы или применить фильтрацию, вы можете указать нужные столбцы после ключевого слова SELECT и/или добавить условия с помощью оператора WHERE. В данном запросе используется оператор WHERE для того чтобы указать определенный пункт назначения. Результат выполнения запроса представлен на рисунке 8.
Листинг 7 – Запрос 6
SELECT *
FROM `рейс`
WHERE `Пункт прибытия` = 'Тверь';
Рисунок 8 - Результат выполнения запроса 6
Запрос 7 выводит информацию о свободных местах на данный рейс и дату. Запрос 8 представлен в листинге 8. Этот запрос использует таблицу "Билет". Если вам нужно получить только определенные столбцы или применить фильтрацию, вы можете указать нужные столбцы после ключевого слова SELECT и/или добавить условия с помощью оператора WHERE. В данном запросе используется оператор WHERE для того чтобы указать определенный период и рейс. Результат выполнения запроса представлен на рисунке 9.
Листинг 8 – Запрос 7
SELECT *
FROM `билет`
WHERE `Дата приобретения` BETWEEN '2022-10-05' AND '2022-10-12'
AND `№ Рейса` IN (2, 4, 10);
Рисунок 8 - Результат выполнения запроса 7
Запрос 8 выводит информацию о средней стоимости билетов бизнес класса. Запрос 8 представлен в листинге 9. Этот запрос использует оператор JOIN для объединения данных из таблиц "Билет" и "Места" на основе их общих атрибута "№ Места", затем использует оператор AVG для подсчета среднего значения по атрибуту "Стоимость", вывод происходит через создание новой графы оператором SELECT. Результат выполнения запроса представлен на рисунке 10.
Листинг 9 – Запрос 8
SELECT AVG(`Стоимость`) AS `Средняя стоимость билета бизнес класса`
FROM `билет`
JOIN `места` ON `билет`.`№ Места` = `места`.`№ Места`
WHERE `места`.`Класс` = 'бизнес';
Рисунок 9 - Результат выполнения запроса 8
Запрос 9 выводит информацию о том какой экипаж чаще обслуживает рейсы. Запрос 9 представлен в листинге 10. Этот запрос использует оператор JOIN для объединения данных из таблиц "Рейс" и "Экипаж" на основе их общих атрибута "№ Экипажа", затем использует оператор COUNT для подсчета значений по атрибуту "№ Экипажа", далее группирует с помощью оператора GROUP BY по атрибутам "№ Экипажа" и "Название", вывод происходит через создание нового столбца оператором SELECT. Результат выполнения запроса представлен на рисунке 11.
Листинг 10 – Запрос 9
SELECT `экипаж`.`№ Экипажа`, `экипаж`.`Название`, COUNT(`рейс`.`№ Экипажа`) AS `Частота обслуживания`
FROM `рейс`
JOIN `экипаж` ON `рейс`.`№ Экипажа` = `экипаж`.`№ Экипажа`
GROUP BY `экипаж`.`№ Экипажа`, `экипаж`.`Название`
ORDER BY COUNT(`рейс`.`№ Экипажа`) DESC;
Рисунок
10 - Результат выполнения запроса 9
Запрос 10 выводит список с Ф.И.О. пассажиров, номером места, классом и расположением на определенный рейс для удобства сотрудников. Запрос 10 представлен в листинге 11. Этот запрос использует оператор JOIN для объединения данных из таблиц "Билет", "Места" и "Пассажиры" на основе их общих атрибутов "№ Пассажира" и "№ Места", затем использует оператор WHERE фильтрации по определенному рейсу. Результат выполнения запроса представлен на рисунке 12.
Листинг 11 – Запрос 10
SELECT `билет`.`№ Места`, `места`.`Класс`, `места`.`Расположение`, `пассажиры`.`Ф.И.О.`
FROM `билет`
JOIN `места` ON `билет`.`№ Места` = `места`.`№ Места`
JOIN `пассажиры` ON `билет`.`№ Пассажира` = `пассажиры`.`№ Пассажира`
WHERE `билет`.`№ Рейса` = 4;
Рисунок 11 - Результат выполнения запроса 10