Загрузка данных
Да, вот так и нужно делать: **текст + места под рисунки + листинги кода**. Ниже я оформлю тебе **готовый фрагмент основной части** в нормальном стиле отчёта, чтобы ты мог вставить его почти без правок. SQL и объекты БД я привяжу к типовой структуре вашей темы «учет жалоб и заявок клиентов», а рядом оставлю места под скриншоты.[1][2]
## Основная часть
### 1. Предметная область и тема базы данных
В ходе прохождения производственной практики была изучена предметная область **«Обращения клиентов»**. Темой разработанной базы данных является **«учет жалоб и заявок клиентов»**. База данных предназначена для хранения информации о клиентах, их обращениях, статусах обработки, исполнителях и результатах рассмотрения.
На основе анализа предметной области были определены основные сущности и связи между ними, что позволило сформировать структуру реляционной базы данных и обеспечить целостность хранимой информации.[3][1]
**Рисунок 1 — Схема предметной области и структура базы данных**
***
### 2. Структура базы данных
Структура базы данных была реализована на основе нескольких взаимосвязанных таблиц. Основными таблицами являются: `clients`, `requests`, `request_types`, `statuses`, `employees`, `categories`, `request_history`, `responses`.
Для каждой таблицы были определены первичные ключи, а между таблицами настроены внешние ключи. Это позволило связать обращения с конкретными клиентами, категориями и ответственными сотрудниками, а также отслеживать историю изменения статусов. Использование внешних ключей обеспечивает корректность связей между данными и предотвращает появление несогласованных записей.[4][1][3]
**Листинг 1 — Создание таблицы клиентов**
```sql
CREATE TABLE clients (
client_id INT AUTO_INCREMENT PRIMARY KEY,
full_name VARCHAR(150) NOT NULL,
phone VARCHAR(20),
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
```
**Листинг 2 — Создание таблицы обращений**
```sql
CREATE TABLE requests (
request_id INT AUTO_INCREMENT PRIMARY KEY,
client_id INT NOT NULL,
request_type_id INT NOT NULL,
status_id INT NOT NULL,
employee_id INT,
request_date DATE NOT NULL,
description TEXT NOT NULL,
CONSTRAINT fk_requests_clients
FOREIGN KEY (client_id) REFERENCES clients(client_id),
CONSTRAINT fk_requests_types
FOREIGN KEY (request_type_id) REFERENCES request_types(request_type_id),
CONSTRAINT fk_requests_statuses
FOREIGN KEY (status_id) REFERENCES statuses(status_id),
CONSTRAINT fk_requests_employees
FOREIGN KEY (employee_id) REFERENCES employees(employee_id)
) ENGINE=InnoDB;
```
**Рисунок 2 — Структура таблиц и связи между ними**
***
### 3. Доработка и расширение базы данных
В процессе практики база данных была доработана и расширена. Были добавлены таблицы, необходимые для более полного учета работы с обращениями клиентов: история изменений, таблица ответов и таблица категорий обращений. Также были уточнены поля в существующих таблицах и добавлены ограничения целостности.
Расширение структуры позволило хранить не только сами обращения, но и этапы их обработки, что сделало базу данных более функциональной и удобной для анализа.[1][3]
**Листинг 3 — Создание таблицы истории обращений**
```sql
CREATE TABLE request_history (
history_id INT AUTO_INCREMENT PRIMARY KEY,
request_id INT NOT NULL,
old_status_id INT,
new_status_id INT,
change_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_history_request
FOREIGN KEY (request_id) REFERENCES requests(request_id)
ON DELETE CASCADE
) ENGINE=InnoDB;
```
**Рисунок 3 — Добавленные таблицы в структуре БД**
***
### 4. Пользовательский интерфейс
Для работы с базой данных был разработан пользовательский интерфейс, обеспечивающий взаимодействие с информацией через формы ввода и редактирования. В интерфейсе реализованы элементы для добавления, изменения, удаления и поиска записей.
Отдельно были созданы формы для просмотра обращений клиентов, фильтрации по статусу и категории, а также для вывода результатов обработки. Пользовательский интерфейс упростил работу с базой данных и сделал процесс поиска информации более наглядным.[5]
**Рисунок 4 — Главная форма приложения**
**Рисунок 5 — Форма добавления обращения**
**Рисунок 6 — Форма поиска и просмотра обращений**
***
### 5. SQL-запросы
В ходе практики были разработаны SQL-запросы различной сложности. Использовались запросы на выборку данных, объединение таблиц и вычисление итоговых показателей. При выполнении запросов применялись операторы `JOIN`, `GROUP BY`, а также агрегатные функции `COUNT`, `SUM` и `AVG`.[2][6]
**Листинг 4 — Запрос на выборку обращений с данными клиента**
```sql
SELECT r.request_id, c.full_name, rt.type_name, s.status_name, r.request_date
FROM requests r
JOIN clients c ON r.client_id = c.client_id
JOIN request_types rt ON r.request_type_id = rt.request_type_id
JOIN statuses s ON r.status_id = s.status_id;
```
**Листинг 5 — Запрос с агрегатной функцией**
```sql
SELECT s.status_name, COUNT(*) AS request_count
FROM requests r
JOIN statuses s ON r.status_id = s.status_id
GROUP BY s.status_name;
```
**Листинг 6 — Запрос с объединением и группировкой**
```sql
SELECT c.full_name, COUNT(r.request_id) AS total_requests
FROM clients c
LEFT JOIN requests r ON c.client_id = r.client_id
GROUP BY c.full_name;
```
**Рисунок 7 — Результат выполнения SQL-запросов**
***
### 6. Представления, процедуры и триггеры
Для автоматизации обработки данных были созданы дополнительные объекты базы данных. В частности, было разработано представление, позволяющее получать список активных обращений без повторного написания сложного запроса. Также был реализован триггер, который автоматически сохраняет изменения статуса обращения в таблицу истории.[7][8][5]
**Листинг 7 — Создание представления**
```sql
CREATE VIEW active_requests_view AS
SELECT r.request_id, c.full_name, rt.type_name, s.status_name, r.request_date
FROM requests r
JOIN clients c ON r.client_id = c.client_id
JOIN request_types rt ON r.request_type_id = rt.request_type_id
JOIN statuses s ON r.status_id = s.status_id
WHERE s.status_name <> 'Закрыто';
```
**Листинг 8 — Создание триггера**
```sql
CREATE TRIGGER trg_request_status_change
AFTER UPDATE ON requests
FOR EACH ROW
INSERT INTO request_history (request_id, old_status_id, new_status_id)
VALUES (NEW.request_id, OLD.status_id, NEW.status_id);
```
**Рисунок 8 — Результат работы представления**
**Рисунок 9 — Срабатывание триггера при изменении статуса**
***
### 7. Администрирование и защита данных
В рамках практики были выполнены действия по администрированию базы данных. Был создан пользователь с ограниченными правами доступа, которому были предоставлены только необходимые разрешения на работу с данными. Это позволило реализовать разграничение доступа и повысить уровень защиты информации.
Также было выполнено резервное копирование базы данных для обеспечения возможности восстановления данных в случае сбоя или ошибок. Дополнительно использовались ограничения целостности и внешние ключи, предотвращающие некорректное изменение информации.[4][1]
**Листинг 9 — Создание пользователя и назначение прав**
```sql
CREATE USER 'operator'@'localhost' IDENTIFIED BY 'password123';
GRANT SELECT, INSERT, UPDATE ON practice_db.* TO 'operator'@'localhost';
```
**Рисунок 10 — Настройка прав доступа**
***
### 8. Тестирование и результаты работы
После завершения разработки было проведено тестирование базы данных. Проверялась корректность добавления, редактирования, удаления и поиска записей, а также правильность работы SQL-запросов, представлений и триггеров.
Результаты тестирования показали, что база данных функционирует корректно, все основные операции выполняются без ошибок, а пользовательский интерфейс обеспечивает удобную работу с информацией. Разработанная система соответствует требованиям индивидуального задания и может использоваться для учета обращений клиентов.[8][2][5]
**Рисунок 11 — Результаты тестирования базы данных**
***
Если хочешь, следующим сообщением я могу сразу сделать тебе **заключение в том же стиле**, чтобы весь отчёт был готовым блоком.
Источники
[1] MySQL 8.4 Reference Manual :: 15.1.20.5 FOREIGN KEY Constraints https://dev.mysql.com/doc/refman/8.4/en/create-table-foreign-keys.html
[2] How to Use JOIN with Aggregate Functions in MySQL - OneUptime https://oneuptime.com/blog/post/2026-03-31-mysql-join-aggregate-functions/view
[3] 7.6 Using Foreign Keys - MySQL Tutorial https://dev.mysql.com/doc/mysql-tutorial-excerpt/5.7/en/example-foreign-keys.html
[4] MySQL FOREIGN KEY Constraint - W3Schools https://www.w3schools.com/mysql/mysql_foreignkey.asp
[5] MySQL Triggers and Updatable Views - Percona https://www.percona.com/blog/triggers-and-updatable-views/
[6] An Introduction to Using SQL Aggregate Functions with JOINs https://learnsql.com/blog/introduction-using-aggregate-functions-joins/
[7] How to View All Triggers in MySQL - OneUptime https://oneuptime.com/blog/post/2026-03-31-mysql-view-all-triggers/view
[8] 15.7.7.41 SHOW TRIGGERS Statement - MySQL :: Developer Zone https://dev.mysql.com/doc/refman/9.4/en/show-triggers.html
[9] How to Create a Table with Foreign Key Constraints in MySQL https://oneuptime.com/blog/post/2026-03-31-mysql-foreign-key-constraints/view
[10] SQL join with aggregate function - Stack Overflow https://stackoverflow.com/questions/59804251/sql-join-with-aggregate-function