Консольное приложение для управления справочником сотрудников с использованием базы данных PostgreSQL.
Автор: Yan Bubenok (yan@bubenok.com)
- Создание таблицы сотрудников
- Добавление записей о сотрудниках
- Просмотр уникальных сотрудников с расчетом возраста
- Автоматическая генерация тестовых данных (1M+ записей)
- Эффективная выборка данных по критериям
- Оптимизация запросов через индексы
- Docker и Docker Compose
- Свободный порт 5432 для PostgreSQL
# Запуск контейнеров
docker compose up -d
# Вход в контейнер приложения
docker compose exec app bash# Внутри контейнера
./build.shСоздает таблицу employees с полями для хранения данных сотрудников.
./build/myApp 1Добавляет одного сотрудника в базу данных.
./build/myApp 2 "Ivanov Petr Sergeevich" 2009-07-12 MaleФормат: ./build/myApp 2 "Фамилия Имя Отчество" ГГГГ-ММ-ДД Пол
Пол: Male или Female
Выводит все уникальные записи, отсортированные по ФИО, с расчетом возраста.
./build/myApp 3Генерирует 1,000,000 случайных записей и 100 мужчин с фамилией на "F".
./build/myApp 4Примерное время выполнения: 15-25 секунд
Выполняет выборку мужчин с фамилией, начинающейся на "F", с замером времени выполнения.
./build/myApp 5Результаты замера (до оптимизации): ~100-120 мс
Создает индекс для ускорения запросов из режима 5.
./build/myApp 6Результаты замера (после оптимизации): ~50-70 мс (ускорение в 2 раза)
# Создаем таблицу
./build/myApp 1
# Добавляем несколько сотрудников
./build/myApp 2 "Smith John Michael" 1985-03-15 Male
./build/myApp 2 "Johnson Mary Elizabeth" 1990-11-20 Female
./build/myApp 2 "Foster Robert Alexander" 1988-05-10 Male
# Просматриваем всех сотрудников
./build/myApp 3
# Генерируем тестовые данные
./build/myApp 4
# Выполняем выборку ДО оптимизации
./build/myApp 5
# Применяем оптимизацию
./build/myApp 6
# Выполняем выборку ПОСЛЕ оптимизации
./build/myApp 5Приложение построено с использованием объектно-ориентированного подхода:
-
Employee - класс для представления сотрудника
- Методы:
saveToDB(),calculateAge(),batchInsert()
- Методы:
-
Database - класс для работы с PostgreSQL
- Использует библиотеку libpqxx
- Поддерживает пакетные операции
Подробнее см. DECISIONS.md
# Остановка контейнеров
docker compose down
# Остановка и удаление данных
docker compose down -vПараметры настраиваются через переменные окружения в docker-compose.yml:
DB_HOST- хост PostgreSQL (по умолчанию: postgres)DB_PORT- порт (по умолчанию: 5432)DB_NAME- имя базы данных (по умолчанию: ptmk_db)DB_USER- пользователь (по умолчанию: ptmk_user)DB_PASSWORD- пароль (по умолчанию: ptmk_password)
.
├── docker-compose.yml # Конфигурация Docker
├── Dockerfile # Образ для сборки приложения
├── CMakeLists.txt # Конфигурация сборки
├── build.sh # Скрипт сборки
├── include/ # Заголовочные файлы
│ ├── Employee.h
│ └── Database.h
├── src/ # Исходные файлы
│ ├── main.cpp
│ ├── Employee.cpp
│ └── Database.cpp
└── build/ # Директория сборки (создается автоматически)
- Вставка 1M записей: ~19 секунд
- Выборка без индекса: ~100-120 мс
- Выборка с индексом: ~50-70 мс
- Ускорение: ~2x
Используется составной индекс:
CREATE INDEX idx_gender_surname
ON employees (gender, surname text_pattern_ops)Индекс с text_pattern_ops оптимизирует поиск по префиксу фамилии (LIKE 'F%').
Разработано в рамках тестового задания.
Контакты: yan@bubenok.com