Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет производственная практика Магальник.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
3.28 Mб
Скачать

Ф едеральное агенство воздушного транспорта (росавиация)

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)

Кафедра вычислительных машин, комплексов, систем и сетей.

Отчет защищен с оценкой

(подпись преподавателя, дата)

ОТЧЕТ

По результатам выполнения практики

Производственная 2. Эксплуатационная практика

Выполнила студентка группы ИС221

________________________________

(Ф.И.О., № зачетной книжки) ________________________________

(подпись, дата)

МОСКВА – 2025

Аннотация.

Целями практики являются:

  • получение профессиональных умений и опыта освоения новых технологий, методов и средств реализации прикладных систем на основе баз данных;

  • получение профессиональных навыков построения информационной модели данных для конкретной задачи и проектирования прикладной программной системы;

  • получение профессиональных навыков работы в автоматизированном режиме на всех этапах разработки проекта;

  • совершенствование профессиональной компоненты образования по направлению информатика и вычислительная техника.

Задачи практики:

  • закрепление навыков разработки, отладки, тестирования и документирования программного обеспечения на базе теоретических знаний, полученных при изучении дисциплин курса: «Безопасность жизнедеятельности»; «Операционные системы»; «Программирование»; «Базы данных», для использования их в последующих дисциплинах по вычислительной технике и при дипломном проектировании;

  • получение профессиональных навыков работы в команде;

  • выработка соответствующих квалификационным характеристикам первичных профессиональных умений.

Оглавление

Введение 4

Практическое задание 4

Техническое задание 4

Теоретическая часть 5

Этапы реализации системы 7

PostgreSQL 7

Наполнение базы данных 7

Запросы 12

Индексы 19

Роли 22

Процедуры 23

Триггеры 24

Выходной документ 25

MongoDB 25

Наполнение базы данных 25

Запросы 29

Индексы 36

Роли 40

Процедуры 41

Триггеры 42

Выходной документ 43

Заключение 45

Введение.

Производственная практика является важным этапом в обучении студентов, который позволяет интегрировать теоретические знания и практические навыки в реальных условиях. В рамках данной практики задача заключается в создании базы данных, содержащей информацию о пеших туристических походах, а также разработке интерактивной системы для обработки данных. Эта система должна обеспечить полноценное ведение базы данных, контроль целостности данных, а также возможность работы нескольких пользователей с различными уровнями доступа. Реализация этих задач предоставит возможность не только углубить знания в области баз данных, но и развить навыки программирования и проектирования пользовательских интерфейсов.

Практическое задание.

Реализовать базу данных, созданную в 5 семестре, в двух других СУБД:

  1. В реляционной СУБД: в Postgres (обязательно для тех, кто в ней не делал) или в любой другой из списка, приведенного ниже.

  2. В NoSQL СУБД (рекомендовано MongoDB или Redis)

Требования к выполнению:

  • Создание схемы БД

  • Наполнение БД (не менее 3 кортежей в каждой сущности, в основных – не менее 10 или более, если требуется для демонстрации работоспособности запросов).

  • Создание запросов модификации данных (5 запросов).

  • Создание запросов на выборку данных (не менее 10, в том числе не менее половины сложных – 3-4 таблицы).

  • Создание ролей (не менее 2).

  • Создание триггера.

  • Создание выходного документа, выполняющего не менее 5 подстановок.

Техническое задание.

Создать базу данных, содержащую сведения о заданном объекте (в соответствии с вариантом) и разработать интерактивную систему для обработки данных базы. Система должна обеспечивать:

  • ведение БД: просмотр, корректировку, удаление, дополнение;

  • контроль ограничения целостности (ограничение значений атрибутов и структурные ограничения);

  • использование нескольких пользователей в СУБД (минимум – администратор и пользователь) и соответственно программный интерфейс с разными уровнями доступа (например, администратор имеет право на все - создание, удаление, изменение, извлечение, а пользователь - только на извлечение);

  • формирование выходных форм в соответствии с заданиями,

  • извлечение информации по запросам пользователей в соответствии с бизнес-правилами и функционалом системы.

База данных должна содержать сведения о следующих объектах:

Пользователи – ФИО, телефон, почта, дата рождения, пройденные маршруты (с учетом даты и оценки, которой может не быть), арендованное снаряжение (что и когда брал и сдал, претензии (если есть)), чаты.

Группы пользователей – ответственный пользователь, члены группы

Инструктор (сопровождающий) – ФИО, контактные данные, стаж работы, квалификация, чаты, в которых состоит.

Чаты – название, время создания, пользователи, сообщения, кто отправил, время.

Маршруты – название, даты, сложность, привалы, пользователи, продолжительность, загруженность, стоимость, рейтинг.

Точки остановки (привалы) – местоположение, название, загруженность, вместимость, имеющиеся инфраструктура (столы, места для огня …).

Снаряжение – название, количество, цена, общая характеристика, местоположение, испорченное (списанное).

Выходные документы:

  • Маршрут

  • Список свободного снаряжение

  • Чек на арендованное снаряжение, оповещение для туриста

Бизнес-правила:

  • После прохождения маршрута появляется возможность его оценить

  • Группа не может уйти без сопровождающего.

  • Возможность аренды появляется только тогда, как предмет снаряжения есть на складе.

  • Снаряжение арендуется на исходной точке.

  • Клиент, на которого оформляется поход должен быть старше 18 лет.

Теоретическая часть.

База данных — это упорядоченный набор структурированной информации или данных, которые обычно хранятся в электронном виде в компьютерной системе. База данных обычно управляется системой управления базами данных (СУБД). Данные вместе с СУБД, а также приложения, которые с ними связаны, называются системой баз данных, или, для краткости, просто базой данных.

Система управления базами данных – это комплекс программных средств, предназначенных для создания, ведения и совместного использования БД многими пользователями.

SQL (Structured Query Language — язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. Является информационно-логическим языком, а не языком программирования.

Язык SQL делится на три части:

  • операторы определения данных (Data Definition Language, DDL)

  • операторы манипуляции данными (Data Manipulation Language, DML)

  • операторы определения доступа к данным (Data Control Language, DCL)

Запрос SQL — это команда, которая позволяет взаимодействовать с базами данных, искать, сортировать и извлекать нужную информацию.  

Основная цель запроса — точно указать, какие данные необходимы и как их следует извлекать или изменять. 

SQL-запросы делятся на несколько видов в зависимости от их назначения и функциональности:

  • Запросы на выборку данных (Data Query Language, DQL). Используются для извлечения данных из базы данных. 

  • Запросы на манипуляцию данными (Data Manipulation Language, DML). Позволяют изменять данные в таблицах. 

  • Запросы на определение данных (Data Definition Language, DDL). Используются для создания и изменения структуры базы данных. 

  • Запросы на управление данными (Data Control Language, DCL). Используются для управления доступом к данным и правами пользователей. 

  • Запросы на управление транзакциями (Transaction Control Language, TCL). Управляют транзакциями в базе данных.

Индекс – это набор ссылок, упорядоченных по определенному столбцу таблицы, который в данном случае будет называться индексированным столбцом. Хотя индекс и связан с конкретным столбцом (или столбцами) таблицы, все же он является самостоятельным объектом базы данных.

Роли — это группы разрешений, которые определяют, кто и как будет иметь доступ к данным. 

Основные типы ролей: 

  1. Роли на уровне сервера.

  2. Роли на уровне базы данных. 

  3. Роли на уровне приложения. 

Хранимые процедуры представляют собой набор команд, состоящий из одного или нескольких операторов SQL или функций и сохраняемый в базе данных в откомпилированном виде.

Триггеры – особый инструмент, используемый для поддержания целостности данных в базе данных. Специальный тип хранимых процедур, запускаемых сервером автоматически при попытке изменения данных в таблицах, с которыми триггеры связаны. Каждый триггер привязывается к конкретной таблице.

Этапы реализации системы.

Для наполнения базы данных использовались запросы по созданию таблиц и добавлению внутрь них каких-либо данных. Также для корректного функционирования системы были написаны триггеры и процедуры и спроектированы роли пользователей базы данных. Индексация полей в таблицах происходила из соображений того, что в будущем по этим полям планируется производить поиск и сортировку.

        1. PostgeSQL

Наполнение базы данных.

Рис. 1. Наполнение таблицы chat_user.

Рис. 2. Наполнение таблицы chat.

Рис. 3. Наполнение таблицы costumers.

Рис. 4. Наполнение таблицы damage_of_equipment.

Рис. 5. Наполнение таблицы equipment.

Рис. 6. Наполнение таблицы halts.

Рис. 7. Наполнение таблицы instructors.

Рис. 8. Наполнение таблицы messages.

Рис. 9. Наполнение таблицы qualification_of_instructor.

Рис. 10. Наполнение таблицы rent.

Рис. 11. Наполнение таблицы review.

Рис. 12. Наполнение таблицы route_halt.

Рис. 13. Наполнение таблицы routes.

Рис. 14. Наполнение таблицы teams.

Рис. 15. Наполнение таблицы trip.

Рис. 16. Наполнение таблицы type_of_halt.

Запросы.

Ищем маршруты, длительность которых меньше или равна 24 часам:

SELECT * FROM routes WHERE duration_in_hours <= 24

Рис. 17. Результат работы запроса.

Ищем имена и фамилии инструкторов, которые получили дипломы раньше 2022 года:

SELECT last_name, first_name FROM instructors JOIN qualification_of_instructor ON instructors.instructor_id = qualification_of_instructor.instructor WHERE extract(year from date_of_receipt) < 2022;

Рис. 18. Результат работы запроса.

Найти имя маршрута, у которых больше одного привала:

SELECT title FROM routes JOIN route_halt ON routes.route_id = route_halt.route GROUP BY title HAVING COUNT(route_halt.halt) > 1;

Рис. 19. Результат работы запроса.

Найти максимальное количество привалов на всех маршрутах:

SELECT MAX(halt_count) AS max_halts FROM ( SELECT route_halt.route, COUNT(route_halt.halt) AS halt_count FROM route_halt GROUP BY route_halt.route) AS route_halt_counts;

Рис. 20. Результат работы запроса.

Найти минимальное количество привалов на всех маршрутах:

SELECT MIN(halt_count) AS min_halts FROM ( SELECT route_halt.route, COUNT(route_halt.halt) AS halt_count FROM route_halt GROUP BY route_halt.route) AS route_halt_counts;

Рис. 21. Результат работы запроса.

Средний возраст туристов:

SELECT ROUND(AVG(EXTRACT(YEAR FROM AGE(date_of_birth)))) AS average_age FROM costumers;

Рис. 22. Результат работы запроса.

Вывести название и цену самого дорогого и самого дешевого маршрута:

SELECT title, price FROM routes WHERE price = (SELECT MAX(price) FROM routes) OR price = (SELECT MIN(price) FROM routes);

Рис. 23. Результат работы запроса.

Найти людей, которые ходили в поход с Егоровой Аллой Альбертовной и в каком году это было:

SELECT DISTINCT extract(year from trip.date_of_begining), costumers.last_name, costumers.first_name, costumers.middle_name FROM trip

JOIN teams AS tm1 ON trip.trip_id = tm1.trip

JOIN costumers ON costumers.user_id = tm1.user2

WHERE

EXISTS (

SELECT 1

FROM costumers AS c

JOIN teams AS tm3 ON c.user_id = tm3.user2

WHERE c.last_name = 'Egorova'

AND c.first_name = 'Alla'

AND c.middle_name = 'Albertovna'

AND c.user_id = tm3.user2

)

AND NOT (costumers.last_name = 'Egorova'

AND costumers.first_name = 'Alla'

AND costumers.middle_name = 'Albertovna')

ORDER BY extract(year from trip.date_of_begining);

Рис. 24. Результат работы запроса.

Найти когда, куда и с каким инструктором ходила Егорова Алла Альбертовна:

SELECT DISTINCT routes.title, trip.date_of_begining, trip.date_of_ending, instructors.last_name, instructors.first_name, instructors.middle_name FROM trip

JOIN teams AS tm1 ON trip.trip_id = tm1.trip

JOIN instructors ON instructors.instructor_id = tm1.instructor

JOIN routes ON routes.route_id = trip.route

WHERE

EXISTS (

SELECT 1

FROM costumers AS c

JOIN teams AS tm3 ON c.user_id = tm3.user2

WHERE c.last_name = 'Egorova'

AND c.first_name = 'Alla'

AND c.middle_name = 'Albertovna'

AND c.user_id = tm3.user2

);

Рис. 25. Результат работы запроса.

Вывести название маршрутов, на который сходило больше 10 человек в июне любого года и длительность которого 72 часа (3 дня):

SELECT routes.title FROM routes

JOIN trip AS tp ON routes.route_id = tp.route

JOIN teams AS tm ON tm.trip = tp.trip_id

WHERE routes.duration_in_hours = 72 AND extract (MONTH from tp.date_of_begining)=6

GROUP BY routes.title

HAVING COUNT(tm.user2) >= 10;

Рис. 26. Результат работы запроса.

Вывести данные людей, которые ходили на маршрут «The road to the Lavra»:

SELECT

c.last_name,

c.first_name,

c.middle_name,

c.phone_number

FROM

costumers AS c

JOIN

teams AS tm ON c.user_id = tm.user2

JOIN

trip AS tp ON tm.trip = tp.trip_id

JOIN

routes AS r ON tp.route = r.route_id

WHERE

r.title = 'The road to the Lavra';

Рис. 27. Результат работы запроса.

Индексы.

Индексация полей в таблицах происходила из соображений того, что в будущем по этим полям планируется производить поиск и сортировку. В таблицах chat_user, damage_of_equipment, halts, messages, qualification_of_instructor, rent, review, route_halt, teams и trip индексированные поля создавались автоматически при связывании таблиц между собой. В таблицах equipment и routes индексированными полями являются названия оборудования и маршрутов соответственно. Это было сделано для того, чтоб в будущем при написании запросов эти таблицы было удобно группировать по названию.

CREATE INDEX chat_ind ON chat_user (chat);

CREATE INDEX user2_ind ON chat_user (user2);

Рис. 28. Индексы таблицы chat_user.

CREATE INDEX instructor_ind ON chats (instructor);

Рис. 29. Индексы таблицы chats.

CREATE INDEX rent_ind ON damage_of_equipment (rent);

Рис. 30. Индексы таблицы damage_of_equipment.

CREATE INDEX title_ind ON equipment (title);

Рис. 31. Индексы таблицы equipment.

CREATE INDEX type_ind ON halts (type2);

Рис. 32. Индексы таблицы halts.

CREATE INDEX chat2_ind ON messages (chat);

Рис. 33. Индексы таблицы messages.

CREATE INDEX instructor2_ind ON qualification_of_instructor (instructor);

Рис. 34. Индексы таблицы qualification_of_instructor.

CREATE INDEX user_on_trip_ind ON rent (user_on_trip);

CREATE INDEX equipment_ind ON rent (equipment);

Рис. 35. Индексы таблицы rent.

CREATE INDEX user23_ind ON review (user2);

Рис. 36. Индексы таблицы review.

CREATE INDEX route_ind ON route_halt (route);

CREATE INDEX halt_ind ON route_halt (halt);

Рис. 37. Индексы таблицы route_halt.

CREATE INDEX title2_ind ON routes (title);

Рис. 38. Индексы таблицы routes.

CREATE INDEX trip_ind ON teams (trip);

CREATE INDEX user24_ind ON teams (user2);

CREATE INDEX instructor3_ind ON teams (instructor);

Рис. 39. Индексы таблицы teams.

CREATE INDEX route_ind ON trip (route);

Рис. 40. Индексы таблицы trip.

Роли.

При проектировании данной базы данных были выбраны три роли: администратор, инструктор, турист.

CREATE ROLE administrator;

CREATE ROLE instructor;

CREATE ROLE tourist;

Администратор может видеть все данные в базе, может добавлять, изменять и удалять данные.

GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA hikingtrips2 TO administrator;

Инструктор может видеть данные о походах, привалах, оборудовании и туристах. Он может добавлять, изменять и удалять данные в таблицах походов, привалов и оборудовании и может только просматривать таблицу туристов.

GRANT INSERT, UPDATE, DELETE ON hikingtrips2.routes TO instructor;

GRANT INSERT, UPDATE, DELETE ON hikingtrips2.halts TO instructor;

GRANT INSERT, UPDATE, DELETE ON hikingtrips2.equipment TO instructor;

GRANT SELECT ON hikingtrips2.costomers TO instructor;

Турист может только просматривать таблицу походов, привалов и оборудования.

GRANT SELECT ON hikingtrips2.routes TO tourist;

GRANT SELECT ON hikingtrips2.halts TO tourist;

GRANT SELECT ON hikingtrips2.equipment TO tourist;

Процедуры.

Процедура для снижения цен маршрутов на 10% в конце месяца:

BEGIN

IF date_trunc('month', current_date + interval '1 day') = date_trunc('month', current_date) THEN

UPDATE routes

SET price = price * 0.9

WHERE price IS NOT NULL;

END IF;

END;

Триггеры.

Триггер для проверки вводимой даты рождения:

BEGIN

IF NEW.birth_year > 2007 THEN

RAISE EXCEPTION 'The user is under 18 years old. You cannot add underage users;

END IF;

RETURN NEW;

END;

Триггер для проверки вводимого адреса электронной почты:

BEGIN

IF NEW.phone IS NOT NULL AND (LENGTH(NEW.phone) <> 11 OR NEW.phone !~ '^[0-9]{11}$') THEN

RAISE EXCEPTION 'The phone number must consist of 11 digits.';

END IF;

RETURN NEW;

END;

Триггер для вводимого номера телефона:

BEGIN

IF NEW.email NOT LIKE '%@%.%' THEN

RAISE EXCEPTION 'Invalid email address has been entered';

END IF;

END

Выходной документ.

Рис. 41. Выходной документ (чек о покупке тура).

2. MongoDB

Наполнение базы данных.

Рис. 42. Наполнение таблицы chat_user.

Рис. 43. Наполнение таблицы chat.

Рис. 44. Наполнение таблицы costumers.

Рис. 45. Наполнение таблицы damage_of_equipment.

Рис. 46. Наполнение таблицы equipment.

Рис. 47. Наполнение таблицы halts.

Рис. 48. Наполнение таблицы instructors.

Рис. 49. Наполнение таблицы messages.

Рис. 50. Наполнение таблицы qualification_of_instructor.

Рис. 51. Наполнение таблицы rent.

Рис. 52. Наполнение таблицы review.

Рис. 53. Наполнение таблицы route_halt.

Рис. 54. Наполнение таблицы routes.

Рис. 55. Наполнение таблицы teams.

Запросы.

Добавление нескольких записей в таблицу equipment:

db.equipment.insertMany([

{ title: 'Extra clothes', amount: '6' },

{ title: 'Extra shoes', amount: '8' }

]);

Рис. 56. Результат работы запроса.

Добавление нескольких записей в таблицу routes:

db.routes.insertMany([

{ route_id: null, title: 'Muranovo Manor Day Hike', duration_in_hours: '24', point_of_departure: 'Ashukinskaya station', price: '2520' },

{ route_id: null, title: 'Smolenskoye Poozerye National Park', duration_in_hours: '48', point_of_departure: 'Smolensk railway Station', price: '15100' }

]);

Рис. 57. Результат работы запроса.

Добавление одной записи в таблицу qualification_of_instructor:

db.qualification_of_instructor.insertOne({

qualification_id: '5',

instructor: '5',

document: 'Hiking school "The Merry Way"',

date_of_receipt: '2023-09-15'

});

Удаление записей из таблицы routes:

db.routes.deleteOne({ title: "One-day winter kayaking trip on the Istra River" });

db.routes.deleteOne({ title: "The Vyatichi Trail" });

db.routes.deleteOne({ title: "Hiking - The Zombie Trail" });

Рис. 58. Результат работы запроса.

Обновление информации о маршруте в таблице routes:

db.routes.updateOne(

{ title: "The magical paths of Kirzhach" },

{ $set: { price: 6000 } }

);

Рис. 59. Результат работы запроса.

Обновление информации о маршруте в таблице routes:

db.routes.updateOne(

{ title: "Following the merchants" },

{ $set: { price: 2700 } }

);

Рис. 60. Результат работы запроса.

Находим туриста с айди = 26:

db.costumers.find({user_id: 26})

Рис. 61. Результат работы запроса.

Вывести вещи со склада, количество которых больше 10:

db.equipment.find({amount: {$gt: 10} })

Рис. 62. Результат работы запроса.

Вывести список аренды, стоимость которой больше 4800:

db.rent.find({price: {$gt: 4800} })

Рис. 63. Результат работы запроса.

Найти максимальное количество привалов на всех маршрутах:

db.route_halt.aggregate([

{

$group: {

_id: "$route",

halt_count: { $sum: 1 }

}

},

{

$group: {

_id: null,

max_halts: { $max: "$halt_count" }

}

},

{

$project: {

_id: 0,

max_halts: 1

}

}

]);

Рис. 64. Результат работы запроса.

Вывести название и цену самого дорогого и самого дешевого маршрута:

db.routes.aggregate([

{

$group: {

_id: null,

maxPrice: { $max: "$price" },

minPrice: { $min: "$price" }

}

},

{

$lookup: {

from: "routes",

let: { maxPrice: "$maxPrice", minPrice: "$minPrice" },

pipeline: [

{

$match: {

$expr: {

$or: [

{ $eq: ["$price", "$$maxPrice"] },

{ $eq: ["$price", "$$minPrice"] }

]

}

}

},

{

$project: {

title: 1,

price: 1

}

}

],

as: "results"

}

},

{

$unwind: "$results"

},

{

$replaceRoot: { newRoot: "$results" }

}

])

Рис. 65. Результат работы запроса.

Индексы.

Индексация полей в таблицах происходила из соображений того, что в будущем по этим полям планируется производить поиск и сортировку. В таблицах chat_user, damage_of_equipment, halts, messages, qualification_of_instructor, rent, review, route_halt, teams и trip индексированные поля создавались автоматически при связывании таблиц между собой. В таблицах equipment и routes индексированными полями являются названия оборудования и маршрутов соответственно. Это было сделано для того, чтоб в будущем при написании запросов эти таблицы было удобно группировать по названию.

db.chat_user.createIndex({ chat: 1 }, { name: "chat_ind" });

db.chat_user.createIndex({ user2: 1 }, { name: "user2_ind" });

Рис. 66. Индексы таблицы chat_user.

db.chats.createIndex({ instructor: 1 }, { name: "instructor_ind" });

Рис. 67. Индексы таблицы chats.

db.damage_of_equipment.createIndex({ rent: 1 }, { name: "rent_ind" });

Рис. 68. Индексы таблицы damage_of_equipment.

db.equipment.createIndex({ title: 1 }, { name: "title_ind" });

Рис. 69. Индексы таблицы equipment.

db.halts.createIndex({ type2: 1 }, { name: "type_ind" });

Рис. 70. Индексы таблицы halts.

db.messages.createIndex({ chat: 1 }, { name: "chat2_ind" });

Рис. 71. Индексы таблицы messages.

db.qualification_of_instructor.createIndex({ instructor: 1 }, { name: "instructor2_ind" });

Рис. 72. Индексы таблицы qualification_of_instructor.

db.rent.createIndex({ user_on_trip: 1 }, { name: "user_on_trip_ind" });

db.rent.createIndex({ equipment: 1 }, { name: "equipment_ind" });

Рис. 73. Индексы таблицы rent.

db.review.createIndex({ user2: 1 }, { name: "user23_ind" });

Рис. 74. Индексы таблицы review.

db.route_halt.createIndex({ route: 1 }, { name: "route_ind" });

db.route_halt.createIndex({ halt: 1 }, { name: "halt_ind" });

Рис. 75. Индексы таблицы route_halt.

db.routes.createIndex({ title: 1 }, { name: "title2_ind" });

Рис. 76. Индексы таблицы routes.

db.teams.createIndex({ trip: 1 }, { name: "trip_ind" });

db.teams.createIndex({ user2: 1 }, { name: "user24_ind" });

db.teams.createIndex({ instructor: 1 }, { name: "instructor3_ind" });

Рис. 77. Индексы таблицы teams.

db.trip.createIndex({ route: 1 }, { name: "route_ind" });

Рис. 78. Индексы таблицы trip.

Роли.

При проектировании данной базы данных были выбраны три роли: администратор, инструктор, турист.

CREATE ROLE administrator;

CREATE ROLE instructor;

CREATE ROLE tourist;

Администратор может видеть все данные в базе, может добавлять, изменять и удалять данные.

db.createRole({

role: "administrator",

privileges: [

{ resource: { db: "hikingtrips", collection: "" }, actions: ["insert", "update", "remove"] }

],

roles: []

});

Инструктор может видеть данные о походах, привалах, оборудовании и туристах. Он может добавлять, изменять и удалять данные в таблицах походов, привалов и оборудовании и может только просматривать таблицу туристов.

db.createRole({

role: "instructor",

privileges: [

{ resource: { db: "hikingtrips", collection: "routes" }, actions: ["insert", "update", "remove"] },

{ resource: { db: "hikingtrips", collection: "halts" }, actions: ["insert", "update", "remove"] },

{ resource: { db: "hikingtrips", collection: "equipment" }, actions: ["insert", "update", "remove"] },

{ resource: { db: "hikingtrips", collection: "customers" }, actions: ["find"] }

],

roles: []

});

Турист может только просматривать таблицу походов, привалов и оборудования.

db.createRole({

role: "tourist",

privileges: [

{ resource: { db: "hikingtrips", collection: "routes" }, actions: ["find"] },

{ resource: { db: "hikingtrips", collection: "halts" }, actions: ["find"] },

{ resource: { db: "hikingtrips", collection: "equipment" }, actions: ["find"] }

],

roles: []

});

Процедуры.

Процедура для снижения цен маршрутов на 10% в конце месяца:

const currentDate = new Date();

const nextMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);

const thisMonth = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);

if (nextMonth.toISOString().substring(0, 7) === thisMonth.toISOString().substring(0, 7)) {

db.routes.updateMany(

{ price: { $ne: null } },

{ $mul: { price: 0.9 } }

);

}

Триггеры.

Триггер для проверки вводимой даты рождения:

const checkUserAge = (newUser) => {

if (newUser.birth_year > 2007) {

throw new Error('The user is under 18 years old. You cannot add underage users.');

}

return newUser;

};

Триггер для проверки вводимого адреса электронной почты:

const validatePhoneNumber = (newUser) => {

if (newUser.phone !== null && (newUser.phone.length !== 11 || !/^[0-9]{11}$/.test(newUser.phone))) {

throw new Error('The phone number must consist of 11 digits.');

}

return newUser;

};

Триггер для вводимого номера телефона:

const validateEmailAddress = (newUser) => {

const emailPattern = /.+@.+\..+/;

if (!emailPattern.test(newUser.email)) {

throw new Error('Invalid email address has been entered');

}

};

Выходной документ.

Рис. 79. Выходной документ (чек о покупке тура).

Заключение.

Завершение производственной практики по созданию базы данных и разработке интерактивной системы должно подтвердить полученные знания и навыки, применяемые в реальных условиях. Успешная реализация всех заданных требований, таких как ведение базы данных, контроль целостности и многопользовательский доступ, подготовит студента к дальнейшей профессиональной деятельности. Полученный опыт станет основой для будущих проектов в области разработки программного обеспечения, а также позволит уверенно работать в команде и принимать обоснованные технические решения.

Завершение производственной практики по созданию базы данных для хранения данных о пеших туристических походах открывает новые горизонты для анализа и управления информацией в данной области. Разработанная система не только эффективно организует данные о маршрутах, участниках и условиях походов, но и обеспечивает простоту доступа и удобство использования для конечных пользователей.

Реализация функционала ведения базы данных, а также контроля целостности и доступа для различных категорий пользователей продемонстрировала важность соблюдения принципов безопасности и удобства. Полученные навыки в проектировании и разработке информационных систем окажутся полезными в будущем, способствуя развитию карьерной траектории. Уверен, что созданная система станет надежным инструментом для энтузиастов пеших походов и позволит улучшить планирование и безопасность в туристической сфере.

45