
- •Аннотация
- •Содержание
- •Введение
- •1. Анализ предметной области
- •2. Обоснование модели данных
- •3. Обоснование выбора субд
- •4. Описание функций групп пользвателей
- •5. Описание функций управления данными
- •6. Организация защиты бд
- •Заключение
- •Приложение а. Руководство пользователя бд
- •Приложение б. Листинг программного кода
- •Список использованных источников
6. Организация защиты бд
Ограничения целостности для каждого информационного объекта:
Общее ограничение: всем полях всех таблиц запрещено иметь NULL значение;
Таблица «Путевки»: предусмотренные виды: туризм, отдых, экскурсия; длительность тура не может быть отрицательной, не может быть больше 89 дней, стоимость ограничена интервалом (0, 500000), количество доступных путевок не может быть отрицательным числом, дата вылета должна быть больше текущей даты.
«Страны»: название страны – первичный ключ, поэтому оно должно быть уникальным;
«Города»: название города – первичный ключ, поэтому оно должно быть уникальным;
«Клиенты»: требуется уникальность следующих данных: логина, пароля, электронной почты, номера телефона, серии и номера паспорта. Пароль имеет минимум 6 символов, проверяется формат электронной почты, возраст пользователя – не меньше 18 лет;
«Отели_вид_номера»: предусмотрены следующие виды номеров: эконом, стандарт, VIP; стоимость не может быть отрицательной;
«Отели»: уникальные название отелей;
«Заказы»: один пользователь не может заказать две одинаковые путевки, итоговая стоимость больше нуля.
Нельзя забронировать тур, если путевки на него закончились;
Пользователь может бронировать путевку только для себя;
Пользователь не может получать, удалять, обновлять и добавлять в таблицу клиентов информацию, связанную с другими клиентами.
Пользователь не может добавлять, удалять, получать информацию из таблицы заказов, связанную с другими клиентами;
Нельзя забронировать путевку с типом номера, которого нет в отеле.
Рекомендуемые средства физической защиты: полное резервное копирование на другой носитель раз в месяц, ежедневное инкрементное копирование таблицы заказов, клиентов, путевок так как эти данные представляют наибольшую важность, особенно информация о забронированных заказах; еженедельное инкрементное копирование остальной информации.
Процедура подтверждения подлинности: процедура подтверждения подлинности в БД в рамках данной работы не была реализована.
Заключение
В ходе курсовой работы была получена работающая система базы данных и написаны запросы для взаимодействия с ней. Для этого были использованы следующие технологии: СУБД PostgreSQL, язык запросов MySQL, ПО DataGrip для создания базы данных.
Приложение а. Руководство пользователя бд
Взаимодействие пользователя с БД через приложение не реализовано. В данном разделе только демонстрируется использование функций на тестовых данных.
Создадим роль пользователя client1, который будет соответствовать клиенту с тем же логином из таблицы «Клиенты» и зададим ему права, которые были перечислены в пунктах 4 и 5 данной работы:
Установим с помощью команды SET ROLE client1 данную роль и протестируем запросы на следующих данных:
Таблица 2 – Тестовые данные «Путевки»
tour_id |
tour_type |
destination_city |
departure_date |
departure_city |
tour_duration |
hotel_name |
tour_cost |
travel_package_count |
1 |
Туризм |
Сингапур |
2022-12-25 |
Москва |
14 |
The old days |
8000 |
15 |
2 |
Отдых |
Афины |
2022-12-25 |
Санкт-Петербург |
7 |
Aphrodite |
15000 |
4 |
3 |
Отдых |
Афины |
2022-12-23 |
Москва |
7 |
Zeus |
10000 |
7 |
4 |
Экскурсия |
Женева |
2022-12-30 |
Москва |
5 |
Convention |
14300 |
2 |
5 |
Экскурсия |
Петрозаводск |
2022-12-27 |
Санкт-Петербург |
3 |
Вуори |
3000 |
15 |
6 |
Отдых |
Валенсия |
2023-01-06 |
Санкт-Петербург |
11 |
Fairy tale |
30000 |
6 |
Таблица 3 – Тестовые данные «Страны»
country_name |
Россия |
Греция |
Китай |
Финляндия |
Италия |
Испания |
Швейцария |
Сингапур |
Таблица 4 – Тестовые данные «Города»
city_name |
country_name |
Санкт-Петербург |
Россия |
Москва |
Россия |
Петрозаводск |
Россия |
Афины |
Греция |
Валенсия |
Испания |
Сингапур |
Сингапур |
Женева |
Швейцария |
Таблица 5 – Тестовые данные «Клиенты»
user_login |
first_name |
second_name |
middle_name |
… |
|
client2 |
Елизавета |
Романова |
Александровна |
lizzza@mail.com |
… |
client3 |
Тимур |
Камилов |
Иванович |
kot@mail.com |
… |
client4 |
Петр |
Водянко |
Петрович |
petro@gmail.com |
… |
client5 |
Юлия |
Сом |
Владимировна |
ananas@yandex.ru |
… |
client1 |
Анатолий |
Иванов |
Анатольевич |
ananat@mail.com |
… |
Приведены не все данные, так как таблица не помещается в документ.
Таблица 6 - Тестовые данные «Отели»
hotel_name |
city_name |
Вуори |
Петрозаводск |
Aphrodite |
Афины |
Zeus |
Афины |
Fairy tale |
Валенсия |
The old days |
Сингапур |
Convention |
Женева |
Таблица 7 – Тестовые данные «Отели_вид_номера»
hotel_name |
room_type |
room_type_cost |
Zeus |
Эконом |
800 |
Zeus |
Стандарт |
1500 |
Zeus |
VIP |
3000 |
Вуори |
Эконом |
600 |
Вуори |
Стандарт |
1000 |
The old days |
Эконом |
1800 |
The old days |
Стандарт |
2200 |
The old days |
VIP |
2600 |
Convention |
Стандарт |
1600 |
Convention |
Эконом |
1200 |
Aphrodite |
Эконом |
1600 |
Aphrodite |
Стандарт |
2600 |
Aphrodite |
VIP |
3600 |
Fairy tale |
Стандарт |
2000 |
Fairy tale |
VIP |
2500 |
В примерах выполнения запросов приведены не все поля таблицы путевки, так как скриншоты получаются слишком большими.
Получение всех доступных путевок командой:
select * from "Путевки";
Выбор по виду:
select * from select_tours_on_type('Туризм');
Выбор по городу:
select * from select_tours_on_city('Афины');
Выбор по стране:
select * from select_tours_on_country('Россия');
По стоимости
select * from select_tour_on_cost(5000, 10000);
Получение списка видов доступных номеров:
select * from get_room_types('The old days');
Расчет стоимости первой путевки с эконом номером:
select * from calculate_tour_cost(1, 'Эконом');
Бронирование пятой путевки с VIP номером
select book_tour('client1', 5, 'Стандарт');
Как видно, количество доступных путевок для забронированного тура уменьшилось.
Попытка забронировать данную путевку еще раз:
Попытка забронировать данную путевку на другого пользователя:
select book_tour('client2', 5, 'VIP');
Попытка бронирования с недопустимым типом номера:
select book_tour('cleint4', 5, 'VIP')
Получение информации из таблицы «Клиенты»:
select * from "Клиенты";
Выводится только текущий пользователь.
Формирование списка стран
select distinct "Города".country_name
from "Путевки", "Города", "Страны"
where
"Путевки".destination_city = "Города".city_name and
"Города".country_name = "Страны".country_name;
Список городов, куда доступны путевки:
select distinct destination_city from "Путевки";
Протестируем функцию вывода путевок по популярности. Забронируем несколько путевок для других пользователей:
и выведем их список по популярности:
select * from select_tour_on_popularity();
Как видно, запрос вывел корректный результат.
Удаление заказа:
delete from "Заказы";
Обновление информации о себе:
update "Клиенты" set first_name = 'Иван';
Как видим, обновление затронуло только строку с текущим пользователем.
Удаление личной записи:
delete from "Клиенты";
Как видим, была удалена только запись о текущем пользователе (с логином client1).