- •Аннотация.
- •Оглавление
- •Введение.
- •Цель курсовой работы.
- •Задание на выполнение курсовой работы.
- •Концептуальная модель данных.
- •Логическая структура данных.
- •Этапы реализации системы.
- •6.1. Запросы.
- •6.2. Индексы.
- •6.3. Роли.
- •6.4. Процедуры.
- •6.5. Триггеры.
- •Руководство пользователя-клиента.
- •Руководство инструктора.
- •Руководство администратора.
- •Список литературы
- •Листинг программ. Интерфейс для пользователя hikingtrips. Файл Form2.Cs
- •Файл Form1.Cs
- •Файл Form4.Cs
- •Файл Form3.Cs
- •Файл Form5.Cs
- •Файл Form6.Cs
- •Листинг программ. Интерфейс для инструктора hikingtripsinstructors. Файл Form1.Cs
- •Файл Form2.Cs
Логическая структура данных.
В Денвере при помощи phpMyAdmin была создана база данных, в которой будут таблицы с различными данными о пеших туристических походах. Создание базы данных представлено на рис. 2.
|
Рис. 2. Создание базы данных.
После в базе данных были созданы следующие таблицы, представленные на рис. 3.
|
Рис. 3. Демонстрация всех существующих таблиц.
Описание существующих таблиц представлено в таблице 1.
Имя таблицы |
Назначение |
Поля |
chat-user |
служебная таблица-связка, через которую туристы по их айди связываются с чатом |
chat_user_id, chat, user |
chats |
нужна для хранения информации о чате: даты и времени создания, названия и инструктора |
chat_id, tittle, date_of_creation, time_of_creation, instructor |
costumers |
содержит данные о туристах: фамилию, имя, отчество, номер телефона, почту и дату рождения |
user_id, last_name, first_name, middle_name, phone_number, email, date_of_birth |
damage_of_equipment |
содержит информацию о том, какое арендованное оборудование было повреждено и по какой причине |
damage_id, description, rent |
equipment |
содержит информацию о том, какое в походе имеется оборудование и в каком количестве |
equipment_id, title, amount |
halts |
содержит информацию о привалах: название, пропускную способность, местоположение, инфраструктуру и тип (берется из словаря) |
halt_id, location, title, capacity_in_people, infrastructure, type |
instructors |
содержит информацию об инструкторах: фамилию, имя, отчество, номер телефона, почту и стаж работы |
instructor_id, last_name, first_name, middle_name, phone_number, email, seniority |
messages |
содержит информацию о присланных в чат сообщениях: в какой чат сообщение было прислано, в какую дату и время оно было прислано |
message_id,chat, message, date_of_sending, time_of_sending |
qualification-of-instructor |
содержит информацию о квалификации инструктора: название документа и дату получения |
qualification_id, instructor, document, date_of_receipt |
rent |
содержит информацию об арендованном оборудовании: кто арендовал, что арендовал и сколько он заплатил за аренду |
rent_id, user_on_trip, equipment, price |
review |
содержит информацию об отзывах на туристические маршруты: кто написал и текст отзыва |
review_id, user, text |
route-halt |
является служебной таблицей-связкой, через которую связаны маршруты и привалы, которые есть на этих маршрутах |
route-halt_id, route, halt |
routes |
содержит информацию о туристических походах: название, стоимость, длительность в часах и точку отправления |
route_id, title, duration_on_hours, point_of_departure, price |
teams |
teams является служебной таблицей-связкой, через которую видно, какой пользователь в какой поход идет, кто его инструктор и был ли этот поход оплачен |
user_trip_id trip, user, instructor, paid_or_not |
trip |
содержит информацию о том, когда начинается и заканчивается пеший поход |
trip_id, route, date_of_begining, date_of_ending |
type-of-halt |
является справочником, в котором хранятся все типа существующих привалов |
type_id, description |
Таблица 1. Таблица со списком всех таблиц из базы данных.
В таблице chat-user три атрибута: первичный ключ chat_user_id типа INT, вторичные ключи chat и user типа INT. Наполнение представлено на рис. 4.
|
Рис. 4. Таблица chat-user.
В таблице chats пять атрибутов: первичный ключ chat_id типа INT, название чата tittle типа VARCHAR(150), дата создания чата date_of_creation типа DATE, время создания чата time_of_creation типа TIME, индекс инструктора instructor типа INT. Наполнение представлено на рис. 5.
|
Рис. 5. Таблица chats.
В таблице costumers семь атрибутов: первичный ключ user_id типа INT, фамилия туриста last_name типа VARCHAR(50), имя туриста first_name типа VARCHAR(50), отчество туриста middle_name типа VARCHAR(50), номер телефона туриста phone_number типа VARCHAR(11), электронная почта туриста email типа VARCHAR(50), дата рождения туриста date_of_birth типа DATE. Наполнение представлено на рис. 6.
|
Рис. 6. Таблица costumers.
В таблице damage_of_equipment три атрибута: первичный ключ damage_id типа INT, описание повреждения description типа VARCHAR(500), айди аренды, где было повреждено оборудование rent типа INT. Наполнение представлено на рис. 7.
|
Рис. 7. Таблица damage_of_equipment.
В таблице equipment три атрибута: первичный ключ equipment_id типа INT, название оборудования title типа VARCHAR(150), количество оборудования amount типа INT. Наполнение представлено на рис. 8.
|
Рис. 8. Таблица equipment.
В таблице halts шесть атрибутов: первичный ключ halt_id типа INT, местоположение привала location типа VARCHAR(150), название привала title типа VARCHAR(150), пропускная способность в людях capacity_in_people типа INT, инфраструктура infrastructure типа VARCHAR(500), тип привала type типа INT. Наполнение представлено на рис. 9.
|
Рис. 9. Таблица halts.
В таблице instructors семь атрибутов: первичный ключ instructor_id типа INT, фамилия инструктора last_name типа VARCHAR(50), имя инструктора first_name типа VARCHAR(50), отчество инструктора middle_name типа VARCHAR(50), номер телефона инструктора phone_number типа VARCHAR(11), электронная почта инструктора email типа VARCHAR(50), трудовой стаж инструктора в годах seniority типа INT. Наполнение представлено на рис. 10.
|
Рис. 10. Таблица instructors.
В таблице messages пять атрибутов: первичный ключ message_id типа INT, айди чата, куда было отправлено сообщение chat типа INT, текст сообщения message типа VARCHAR(1500), дата отправления сообщения date_of_sending типа DATE, время отправления сообщения time_of_sending типа TIME. Наполнение представлено на рис. 11.
|
Рис. 11. Таблица messages.
В таблице qualification-of-instructor четыре атрибута: первичный ключ qualification_id типа INT, индекс инструктора instructor типа INT, сертификат, подтверждающий квалификацию document типа VARCHAR(500), дата получения документа date_of_receipt типа DATE. Наполнение представлено на рис. 12.
|
Рис. 12. Таблица qualification-of-instructor.
В таблице rent четыре атрибута: первичный ключ rent_id типа INT, индекс туриста в походе user_on_trip типа INT, индекс арендованного оборудования equipment типа INT, цена арендованного оборудования price типа INT. Наполнение представлено на рис. 13.
|
Рис. 13. Таблица rent.
В таблице review три атрибута: первичный ключ review_id типа INT, айди пользователя, который оставил отзыв user типа INT, текст отзыва text типа VARCHAR(1500). Наполнение представлено на рис. 14.
|
Рис. 14. Таблица review.
В таблице route-halt три атрибута: первичный ключ route-halt_id типа INT, индекс маршрута route типа INT, индекс привала halt типа INT. Наполнение представлено на рис. 15.
|
Рис. 15. Таблица route-halt.
В таблице routes пять атрибутов: первичный ключ route_id типа INT, название маршрута title типа INT, длительность маршрута в часах duration_on_hours типа INT, точка отправления point_of_departure типа VARCHAR(150), стоимость маршрута price типа INT. Наполнение представлено на рис. 16.
|
Рис. 16. Таблица routes.
В таблице teams пять атрибутов: первичный ключ user_trip_id типа INT, индекс тура trip типа INT, индекс туриста user типа INT, индекс инструктора instructor типа INT, отметка о том, оплачен ли поход или нет paid_or_not типа INT. Наполнение представлено на рис. 17.
|
Рис. 17. Таблица teams.
В таблице trip четыре атрибута: первичный ключ trip_id типа INT, индекс маршрута route типа INT, дата начала date_of_begining типа DATE, дата окончания date_of_ending типа DATE. Наполнение представлено на рис. 18.
|
Рис. 18. Таблица trip.
В таблице type-of-halt два атрибута: первичный ключ type_id типа INT, описание типа привала description типа VARCHAR(500). Наполнение представлено на рис. 19.
|
Рис. 19. Таблица type-of-halt.
Докажем, что все таблицы (кроме словарей и таблиц-связок находятся в 3НФ).
Определим схему БД: ρ = (R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13)
R1 – chats
R1 = (chat_id, title, date_of_creation, time_of_creation, instructor)
Все атрибуты имеют единственное значение, значит R1 находится в 1НФ. Первичным ключом в данном отношении является атрибут chat_id, то есть X = chat_id.
Подберем
Y:
X→Y,
Y
X.
Y = (title, date_of_creation, time_of_creation, instructor)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R1 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R2 – costumers
R2 = (user_id, last_name, first_name, middle_name, phone_number, email, date_of_birth)
Все атрибуты имеют единственное значение, значит R2 находится в 1НФ. Первичным ключом в данном отношении является атрибут user_id, то есть X = user_id.
Подберем Y: X→Y, Y X.
Y = (last_name, first_name, middle_name, phone_number, email, date_of_birth)
В этом отношении есть нюанс, связанный с тем, что есть два не идентифицирующих атрибута phone_number и email, которые также, как и первичный ключ, являются уникальными. Поле phone_number необходимо для добавления пользователя в чаты и возможного восстановления пароля. Поле email необходимо для отправки чека о покупке тура возможного восстановления пароля. В данном случае, для демонстрации курсовой работы было написано приложение, где чек сохраняется на рабочий стол компьютера (см. Руководство пользователя-клиента рис. 66). В рамках курсовой работы описанный выше функционал реализован не будет, но было решено сохранить реальную модель собираемых данных пользователя.
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R2 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R3 – damage_of_equipment
R3 = (damage_id, description, rent)
Все атрибуты имеют единственное значение, значит R3 находится в 1НФ. Первичным ключом в данном отношении является атрибут damage_id, то есть X = damage_id.
Подберем Y: X→Y, Y X.
Y = (description, rent)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R3 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R4 – equipment
R4 = (equipment_id, title, amount)
Все атрибуты имеют единственное значение, значит R4 находится в 1НФ. Первичным ключом в данном отношении является атрибут equipment_id, то есть X = equipment_id.
Подберем Y: X→Y, Y X.
Y = (title, amount)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R4 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R5 – halts
R5 = (halt_id, location, title, capacity_in_people, infrastructure, type)
Все атрибуты имеют единственное значение, значит R5 находится в 1НФ. Первичным ключом в данном отношении является атрибут halt_id, то есть X = halt_id.
Подберем Y: X→Y, Y X.
Y = (location, title, capacity_in_people, infrastructure, type)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R5 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R6 – instructors
R6 = (instructor_id, last_name, first_name, middle_name, phone_number, email, seniority)
Все атрибуты имеют единственное значение, значит R6 находится в 1НФ. Первичным ключом в данном отношении является атрибут instructor_id, то есть X = instructor_id.
Подберем Y: X→Y, Y X.
Y = (last_name, first_name, middle_name, phone_number, email, seniority)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R6 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R7 – messages
R7 = (message_id, chat, message, date_of_sending, time_of_sending)
Все атрибуты имеют единственное значение, значит R7 находится в 1НФ. Первичным ключом в данном отношении является атрибут message_id, то есть X = message_id.
Подберем Y: X→Y, Y X.
Y = (chat, message, date_of_sending, time_of_sending)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R7 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R8 – qualification_of_instructor
R8 = (qualification_id, instructor, document, date_of_receipt)
Все атрибуты имеют единственное значение, значит R8 находится в 1НФ. Первичным ключом в данном отношении является атрибут qualification_id, то есть X = qualification_id.
Подберем Y: X→Y, Y X.
Y = (instructor, document, date_of_receipt)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R8 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R9 – rent
R9 = (rent_id, user_on_trip, equipment, price)
Все атрибуты имеют единственное значение, значит R9 находится в 1НФ. Первичным ключом в данном отношении является атрибут rent_id, то есть X = rent_id.
Подберем Y: X→Y, Y X.
Y = (user_on_trip, equipment, price)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R9 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R10 – review
R10 = (review_id, user, text)
Все атрибуты имеют единственное значение, значит R10 находится в 1НФ. Первичным ключом в данном отношении является атрибут review_id, то есть X = review_id.
Подберем Y: X→Y, Y X.
Y = (user, text)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R10 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R11 – routes
R11 = (route_id, title, duration_in_hours, point_of_departure, price)
Все атрибуты имеют единственное значение, значит R11 находится в 1НФ. Первичным ключом в данном отношении является атрибут route_id, то есть X = route_id.
Подберем Y: X→Y, Y X.
Y = (title, duration_in_hours, point_of_departure, price)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R11 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R12 – teams
R12 = (user_trip_id, trip, user, instructor, paid_or_not)
Все атрибуты имеют единственное значение, значит R12 находится в 1НФ. Первичным ключом в данном отношении является атрибут user_trip_id, то есть X = user_trip_id.
Подберем Y: X→Y, Y X.
Y = (trip, user, instructor, paid_or_not)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R12 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
R13 – trip
R13 = (trip_id, route, date_of_begining, date_of_ending)
Все атрибуты имеют единственное значение, значит R13 находится в 1НФ. Первичным ключом в данном отношении является атрибут trip_id, то есть X = trip_id.
Подберем Y: X→Y, Y X.
Y = (route, date_of_begining, date_of_ending)
Так как первичный ключ однозначно определяет все остальные атрибуты, о можно сказать, что R13 находится в 2НФ.
Так как внутри отношения нет транзитивных функциональных связей между атрибутами, то, следовательно, отношение находится в 3НФ.
|
Рис. 20. Схема базы данных.
|
Рис. 21. Диаграмма ER типа.
