- •Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
- •«Московский технический университет связи и информатики» (мтуси)
- •1 Цель работы
- •2 Задание
- •3 Краткая теория
- •4 Выполнение лабораторной работы
- •4.1 Логическая модель данных
- •4.2 Преобразование в физическую модель данных
- •4.3 Описание физической модели данных
- •5 Выводы
4.1 Логическая модель данных
Логическая модель данных предметной области в стандарте IDEF1X представлена на рисунке 1. Выделены сущности «Маршруты», «Перевозки», «Водители», «Оплаты», между которыми установлены не идентифицирующие связи мощностью один-ко-многим и многие-ко-многим, определенные спецификой предметной области.
Рисунок 1 – Логическая модель данных предметной области
4.2 Преобразование в физическую модель данных
Рассмотрю общие принципы преобразования:
Каждая сущность преобразуется в таблицу. Имя сущности становится именем таблицы;
Каждый атрибут становится столбцом таблицы с тем же именем, уточняется тип данных, выбирается более точный формат;
Каждое отношение «многие-ко-многим» преобразуется в 2- х отношениях «один-ко-многим» в таблицу с тем же именем как у двух связанных сущности (ПерваяСущность_ВтораяСущность);
Идентифицирующие атрибуты сущности превращаются в первичный ключ таблицы.
Формула для преобразования: R1 (И1, А1), где R1 – таблица, И1 – первичный ключ таблицы, А1 – столбец таблицы.
Преобразую каждую сущность, их атрибуты и отношения:
Маршруты
Сущность «Маршруты» преобразуется в соответствующую таблицу «Routes». Атрибуты преобразуются в соответствующие столбцы «rout_id», «r_name», «r_mileage», «r_rate». Идентифицирующий атрибут «Код маршрута» преобразуется в соответствующий первичный ключ «rout_id». Следовательно, получаю:
Routes (route_id, r_name, r_mileage, r_rate).
Перевозки
Сущность «Перевозки» преобразуется в соответствующую таблицу «Transportations». Атрибуты преобразуются в соответствующие столбцы «trans_id», «t_departure», «t_arrival». Идентифицирующий атрибут «Код маршрута» преобразуется в соответствующий первичный ключ «trans_id». Идентификатор 1-связной сущности «Код маршрута» преобразуется в соответствующий внешний ключ (t_route_id). Следовательно, получаю:
Transportations (trans_id, t_departure, t_arrival, t_route_id).
Водители
Сущность «Водители» преобразуется в соответствующую таблицу «Drivers». Атрибуты преобразуются в соответствующие столбцы «driver_id», «d_surname», «d_name», «d_patronymic», «d_experience». Следовательно, получаю:
Drivers (driver_id, d_surname, d_name, d_patronymic, d_experience).
Оплата
Сущность «Оплата» преобразуется в соответствующую таблицу «Payment». Атрибут преобразуются в соответствующий столбец «p_bonus». Идентифицирующий атрибут «Код оплаты» преобразуется в соответствующий первичный ключ «pay_id». Идентификаторы 2-связной сущности «Код перевозки» и «Код водителя» преобразуются в соответствующие внешние ключи «p_trans_id» и «p_driver_id». Следовательно, получаю:
Payment (pay_id, p_bonus, p_trans_id, p_driver_id).
После всех преобразований получаю физическую модель данных. Её схема представлена на рисунке 2.
Рисунок 2 – Физическая модель базы данных
4.3 Описание физической модели данных
База данных сargo_transportation состоит из четырех таблиц:
routes – список маршрутов;
transportations – список перевозок;
payment – список выплат;
drivers – список водителей.
Таблица TRANSPORTATIONS (Перевозки)
Хранит полную информацию о транспортных операциях:
Поле |
Тип |
Доп. свойства поля |
Описание |
trans_id |
INTEGER |
PRIMARY KEY, NOT NULL |
Целочисленный идентификатор обеспечивает уникальность и быстрый поиск. |
t_rout_id |
INTEGER |
FOREIGN KEY (ROUTES.rout_id), NOT NULL |
Ссылка на маршрут. INTEGER выбран для совместимости с PK связанной таблицы. NOT NULL гарантирует, что каждая перевозка привязана к маршруту. |
t_departure |
DATE |
NOT NULL |
Дата в формате YYYY-MM-DD. NOT NULL обеспечивает обязательность указания даты отправления. |
t_arrival |
DATE |
|
Дата прибытия. |
Таблица ROUTES (Маршруты)
Содержит справочник всех маршрутов:
Поле |
Тип |
Ограничения |
Обоснование выбора типа |
rout_id |
INTEGER |
PRIMARY KEY, NOT NULL |
Уникальный числовой идентификатор маршрута. |
r_name |
VARCHAR(100) |
NOT NULL |
Название маршрута длиной до 100 символов (UTF-8). NOT NULL гарантирует наличие названия. |
r_mileage |
INTEGER |
NOT NULL, UNSIGNED |
Расстояние в км (только положительные числа). UNSIGNED запрещает отрицательные значения. |
r_rate |
DECIMAL(7,2) |
NOT NULL, UNSIGNED |
Тарифная ставка (макс. 99999.99). DECIMAL выбран для точных денежных расчетов. NOT NULL и UNSIGNED обеспечивают корректность финансовых данных. |
Таблица PAYMENT (Оплата)
Учет выплат водителям:
Поле |
Тип |
Ограничения |
Обоснование выбора типа |
pay_id |
INTEGER |
PRIMARY KEY, NOT NULL, AUTO_INCREMENT |
Уникальный идентификатор платежа. |
p_trans_id |
INTEGER |
FOREIGN KEY (TRANSPORTATIONS. trans_id), NOT NULL |
Ссылка на перевозку. NOT NULL гарантирует привязку платежа к конкретной перевозке. |
p_driver_id |
INTEGER |
FOREIGN KEY (DRIVERS.driver_id), NOT NULL |
Ссылка на водителя. NOT NULL обеспечивает обязательное указание получателя. |
p_bonus |
DECIMAL(7,2) |
NOT NULL, DEFAULT 0.00 |
Премиальные выплаты. DEFAULT 0.00 исключает NULL-значения при отсутствии премии. |
Таблица DRIVERS (Водители)
Кадровый учет водителей:
Поле |
Тип |
Ограничения |
Обоснование выбора типа |
driver_id |
INTEGER |
PRIMARY KEY, NOT NULL |
Уникальный идентификатор водителя. |
d_surname |
VARCHAR(20) |
NOT NULL |
Фамилия (ограничение 20 символов обычно достаточно для фамилий). |
d_name |
VARCHAR(20) |
NOT NULL |
Имя (аналогично фамилии). |
d_patronymic |
VARCHAR(20) |
NULL |
Отчество (может отсутствовать). |
d_experiens |
INTEGER |
NOT NULL, UNSIGNED |
Стаж в годах (только положительные числа). |
