Система управления заявками — это консольное приложение на языке Python, предназначенное для отслеживания и обработки рабочих заявок сотрудников в рамках структурированного жизненного цикла. Система предоставляет полный набор функций СУБД, обеспечивает соблюдение строгих бизнес-правил и включает широкие возможности для тестирования производительности с использованием PostgreSQL.
Бизнес-процесс Заявка проходит следующие этапы: Новая → В работе → Выполнена
- PostgreSQL
- Python 3.6+
bash
python -m venv venv
.\venv\Scripts\Activate.ps1 // source venv/bin/activate (ubuntu)
pip install --upgrade pip
pip install -r requirements.txt
python app.py
bash
psql
CREATE DATABASE applicationdb;
CREATE USER postgres WITH PASSWORD 'postgres';
GRANT ALL PRIVILEGES ON DATABASE applicationdb TO postgres;
.env
bash
DB_HOST=localhost
DB_NAME=applicationdb
DB_USER=postgres
DB_PASSWORD=postgres
Все операции с базой данных инкапсулированы в классе Database.
- Добавить сотрудника: Вставить нового сотрудника и вернуть ID, чтобы получить сгенерированный ключ.
- Список сотрудников : Извлекать записи в виде объектов.
- Добавить заявка": Вставить новые записи и вернуть ID, чтобы получить сгенерированный ключ.
- Список заявок (с фильтрами): создать динамическое условие WHERE на основе фильтров (статус, исполнитель, отдел, просрочка).
- Статус заявка на изменение: Проверить, входит ли данный переход состояний в список «Допустимые переходы», и, если да «true», внести изменение. В противном случае вернуть «false».
- Изменить исполнителя заявки: Изменить исполнителя можно только в том случае, если заявка является новым или находится в процессе выполнения.
- Отчеты
- подсчитать количество запросов в каждой категории статусов.
- подсчитать все запросы, срок выполнения которых истек, но которые еще не завершены.
- перечислить количество выполненных заявок для каждого исполнителя,
- Сгенерировать тестовые данные (1 млн заявок, 1 тыс. сотрудников): заполнить базу данных тестовыми данными
- Тест производительности (до оптимизации): Выполнить запрос: вывести все просроченные заявки конкретного исполнителя, находящиеся в статусе «В работе», отсортированные по сроку выполнения.
В этой функции измеряется время выполнения (в секундах) с помощью метода
time.time()в Python. Возвращается кортеж (elapsed_time, number_of_rows_returned). Он используется как до, так и после создания индекса для демонстрации оптимизации. - Создание индексов (оптимизация): Создать три индекса для таблицы application с целью повышения производительности запросов:
- idx_applications_executor — по столбцу executor_id.
- idx_applications_status — по столбцу status.
- idx_applications_executor_status_deadline — составной индекс по полям (executor_id, status, deadline), специально предназначенный для ускорения выполнения запросов.
- Тест производительности (после оптимизации): выполнить функциональное нагрузочное тестирование после внесения оптимизаций
- Сначала был запущен запрос для извлечения просроченных запросов (с крайним сроком до сегодняшнего дня), которые в данный момент находятся в процессе обработки и назначены конкретному исполнителю, отсортированных по крайнему сроку. Он вернул 303 записи за 0,1078 секунды. После применения оптимизирующего индекса время обработки 322 записей сократилось до 0,0164.
- Индекс охватывает все столбцы условия WHERE и включает столбец ORDER BY. Теперь база данных может использовать высокоселективный просмотр индекса для извлечения только строк, соответствующих фильтру, и возвращать строки, уже отсортированные по сроку выполнения, непосредственно из индекса, что позволяет исключить отдельный этап сортировки.
- Ускорение = (Время до) / (Время после)= 0.1078 / 0.0164 ≈ 6.57×
- Сокращение времени = (0.1078 − 0.0164) / 0.1078 × 100% ≈ 84.8%