Skip to content

iBubenok/employee-directory-cpp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Справочник сотрудников

Консольное приложение для управления справочником сотрудников с использованием базы данных PostgreSQL.

Автор: Yan Bubenok (yan@bubenok.com)

Возможности

  • Создание таблицы сотрудников
  • Добавление записей о сотрудниках
  • Просмотр уникальных сотрудников с расчетом возраста
  • Автоматическая генерация тестовых данных (1M+ записей)
  • Эффективная выборка данных по критериям
  • Оптимизация запросов через индексы

Требования

  • Docker и Docker Compose
  • Свободный порт 5432 для PostgreSQL

Быстрый старт

1. Запуск окружения

# Запуск контейнеров
docker compose up -d

# Вход в контейнер приложения
docker compose exec app bash

2. Сборка приложения

# Внутри контейнера
./build.sh

3. Использование

Режим 1: Создание таблицы

Создает таблицу employees с полями для хранения данных сотрудников.

./build/myApp 1

Режим 2: Добавление сотрудника

Добавляет одного сотрудника в базу данных.

./build/myApp 2 "Ivanov Petr Sergeevich" 2009-07-12 Male

Формат: ./build/myApp 2 "Фамилия Имя Отчество" ГГГГ-ММ-ДД Пол

Пол: Male или Female

Режим 3: Просмотр всех сотрудников

Выводит все уникальные записи, отсортированные по ФИО, с расчетом возраста.

./build/myApp 3

Режим 4: Автоматическое заполнение

Генерирует 1,000,000 случайных записей и 100 мужчин с фамилией на "F".

./build/myApp 4

Примерное время выполнения: 15-25 секунд

Режим 5: Выборка с замером времени

Выполняет выборку мужчин с фамилией, начинающейся на "F", с замером времени выполнения.

./build/myApp 5

Результаты замера (до оптимизации): ~100-120 мс

Режим 6: Оптимизация базы данных

Создает индекс для ускорения запросов из режима 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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors