Загрузка данных


Да, вот так и нужно делать: **текст + места под рисунки + листинги кода**. Ниже я оформлю тебе **готовый фрагмент основной части** в нормальном стиле отчёта, чтобы ты мог вставить его почти без правок. 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