Troika Studio
0
Нажми, чтобы включить звук
Курсовая работа · 2026
ALEXANDRPODUSHKINALEXANDRPODUSHKINALEXANDRPODUSHKIN
Подушкин Александр Во-090207-9о-24 · 2 курс
МГУТУ им. К.Г. Разумовского

Проектирование и разработка базы данных для авторемонтной мастерской

MySQL 8 · 11 таблиц · 3НФ
scroll
О работе

База данных для автосервиса

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

Я сделал реляционную базу данных, которая собирает все эти потоки в одном месте. 11 таблиц связаны между собой, есть нормализация до 3НФ, целостность через внешние ключи и SQL-запросы под основные задачи.

Работа состоит из трёх частей: теория, проектирование и реализация в MySQL. Если написать клиентское приложение, базу можно реально использовать в работающей мастерской.

СУБД
MySQL 8 (Community Edition, InnoDB)
Модель данных
Реляционная, третья нормальная форма
Сущностей
11 таблиц с внешними ключами и индексами
Кодировка
utf8mb4_unicode_ci
Целостность
ON DELETE RESTRICT · ON UPDATE CASCADE
0
Таблиц в БД
0
Полей в схеме
0
Внешних ключей
0НФ
Нормальная форма
Структура

11 таблиц
одной системы

На каждую сущность отдельная таблица, чтобы не было дубликатов и было проще поддерживать. Связи между таблицами идут через внешние ключи, которые сама СУБД проверяет на целостность.

→ Прокрути дальше, чтобы пролистать схему

01 / 11
clients
Клиенты мастерской
client_idINT PK
last_nameVARCHAR(50)
first_nameVARCHAR(50)
middle_nameVARCHAR(50)
phoneVARCHAR(20)
emailVARCHAR(100)
registration_dateDATE
02 / 11
cars
Автомобили клиентов
car_idINT PK
client_idINT FK
brandVARCHAR(50)
modelVARCHAR(50)
production_yearYEAR
vinVARCHAR(17)
license_plateVARCHAR(15)
mileageINT
03 / 11
employees
Сотрудники сервиса
employee_idINT PK
last_nameVARCHAR(50)
first_nameVARCHAR(50)
middle_nameVARCHAR(50)
positionVARCHAR(50)
phoneVARCHAR(20)
hire_dateDATE
04 / 11
services
Услуги мастерской
service_idINT PK
nameVARCHAR(100)
descriptionTEXT
priceDECIMAL(10,2)
durationINT
05 / 11
parts
Склад запчастей
part_idINT PK
nameVARCHAR(100)
articleVARCHAR(50)
priceDECIMAL(10,2)
stock_quantityINT
unitVARCHAR(10)
06 / 11
suppliers
Поставщики запчастей
supplier_idINT PK
nameVARCHAR(100)
contact_personVARCHAR(100)
phoneVARCHAR(20)
addressVARCHAR(200)
07 / 11
supplies
Поставки от партнёров
supply_idINT PK
supplier_idINT FK
supply_dateDATE
total_amountDECIMAL(12,2)
08 / 11
supply_items
Состав поставки (M:N)
supply_idINT FK PK
part_idINT FK PK
quantityINT
purchase_priceDECIMAL(10,2)
09 / 11
orders
Заказы на ремонт
order_idINT PK
car_idINT FK
employee_idINT FK
accept_dateDATETIME
planned_dateDATE
complete_dateDATETIME
statusENUM
total_costDECIMAL(12,2)
10 / 11
order_services
Услуги в заказе (M:N)
order_idINT FK PK
service_idINT FK PK
quantityINT
actual_priceDECIMAL(10,2)
11 / 11
order_parts
Запчасти в заказе (M:N)
order_idINT FK PK
part_idINT FK PK
quantityINT
actual_priceDECIMAL(10,2)

Три из этих таблиц служат связками. Они реализуют связь «многие ко многим»: в одном заказе много услуг и запчастей, а одна услуга или запчасть фигурирует во многих заказах.

Связи

Как таблицы
говорят друг
с другом

В реляционной модели каждая запись знает о других через ключи. Простая связь, цепочка или сеть «многие ко многим» - всё это делается через PRIMARY KEY и FOREIGN KEY.

01 - Один к одному (1:1)

Не используется
в этой базе

Связь 1:1 на практике почти не нужна. Обычно два таких объекта проще держать в одной таблице. В моей схеме её нет.

02 - Один ко многим (1:N)

Самая частая
связь

У одного клиента несколько машин. Одна машина проходит много заказов за свою жизнь. Один мастер ведёт много работ.

clients
→ 1 : N →
cars
clientscars · один клиент, много машин
carsorders · одна машина проходит много заказов
employeesorders · один мастер ведёт много заказов
supplierssupplies · один поставщик присылает много партий
03 - Многие ко многим (M:N)

Через
третью таблицу

Напрямую в реляционной модели так нельзя. Нужна таблица-связка, в которой каждая запись это пара идентификаторов плюс доп. данные (количество, цена).

orders
order_services
services
ordersservices · через order_services
ordersparts · через order_parts
suppliesparts · через supply_items
SQL в действии

Запросы, которые
решают реальные задачи

Пять обычных сценариев из работы автосервиса. Каждый превращается в короткий SQL-запрос. По сути, ради этого и собирается база.

Поиск автомобилей клиента по фамилии
JOIN
SELECT c.brand, c.model, c.license_plate, c.mileage
FROM cars c
JOIN clients cl ON c.client_id = cl.client_id
WHERE cl.last_name = 'Иванов';
Заказы за текущий месяц
FILTER
SELECT o.order_id, cl.last_name, c.brand,
       c.license_plate, o.accept_date, o.total_cost
FROM orders o
JOIN cars c ON o.car_id = c.car_id
JOIN clients cl ON c.client_id = cl.client_id
WHERE MONTH(o.accept_date) = MONTH(CURRENT_DATE)
  AND YEAR(o.accept_date) = YEAR(CURRENT_DATE)
ORDER BY o.accept_date DESC;
Выручка по видам услуг
GROUP
SELECT s.name,
       SUM(os.quantity * os.actual_price) AS revenue,
       COUNT(DISTINCT os.order_id) AS orders_count
FROM order_services os
JOIN services s ON os.service_id = s.service_id
JOIN orders o ON os.order_id = o.order_id
WHERE o.accept_date BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY s.service_id, s.name
ORDER BY revenue DESC;
Запчасти с низким остатком
STOCK
-- сигнал к закупке, когда осталось меньше 5 штук
SELECT part_id, name, article, stock_quantity, price
FROM parts
WHERE stock_quantity < 5
ORDER BY stock_quantity ASC;
Рейтинг мастеров по году
AGGREGATE
SELECT e.last_name, e.first_name,
       COUNT(o.order_id) AS orders_done,
       SUM(o.total_cost) AS total_revenue
FROM employees e
JOIN orders o ON o.employee_id = e.employee_id
WHERE o.complete_date IS NOT NULL
  AND o.complete_date BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY e.employee_id, e.last_name, e.first_name
ORDER BY orders_done DESC;
О проекте

Beyond the project

Что использовалось
MySQL 8
InnoDB
SQL
MySQL Workbench
3НФ
ER-моделирование
draw.io
utf8mb4
Автор
Подушкин Александр Викторович
Группа
Во-090207-9о-24
Специальность
09.02.07 Информационные системы и программирование
Учреждение
МГУТУ им. К.Г. Разумовского, Волоколамский филиал
Руководитель
Новиков И.Е.
Тема
Проектирование и разработка базы данных для авторемонтной мастерской
Дата защиты
14 мая 2026
Развитие
Клиент на C# или Python, веб-версия, мобильное приложение, SMS-уведомления
Финал

Разработано
в Troika Studio

Troika Studio Дизайн · Разработка · Продакшен
© 2026
Все права защищены