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

В Денвере при помощи 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)

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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НФ.

  1. 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 типа.

Соседние файлы в папке курсовая