Сделано на Spring Boot, Spring Data, Lombok для простоты и ускорения разработки. Из-за этого приложение запускается несколько секунд, не мгновенно.
БД - PostgreSQL поднимается в docker контейнере.
Создание таблиц в БД через Liquibase миграции.
Faker для генерации тестовых данных.
git clone https://github.com/winroot333/ptmk-test.git
cd ptmk-test
Сборка:
mvnw clean package -DskipTests
Запуск бд в контейнере:
docker compose up -d
Запуск приложения:
java -jar .\target\app.jar 3
Таблицы автоматически создаются при запуске приложения, с миграцией Liquibase.
java -jar .\target\app.jar 1
Создана сущность Employee, за отправку в БД отвечает EmployeeService, как принято в Spring.
java -jar .\target\app.jar 2 "Ivanov Petr Sergeevich" 2009-07-12 Male
Сделана выборка с помощью подзапроса, так как Distinct использовать нельзя, нужны уникальные ФИО и дата.
Если несколько сотрудников с одинаковым фио и датой они не выводятся.
Плохой попроизводительности запрос, в реальном приложении использовал бы что-то другое.
Пример для запуска:
java -jar .\target\app.jar 3
Заполнение тестовыми данными, дла ФИО и даты рождения использовал Faker библиотеку. Заполняется кусками по 10000 записей. Пример для запуска:
java -jar .\target\app.jar 4
Пример для запуска:
java -jar .\target\app.jar 5
Для оптимизации создал индекс составной индекс по полям gender и full_name.
Для того чтобы он использовался вручную написал запрос, поставил условия:
AND full_name >= 'F' AND full_name < 'G'
Без этого индекс не использовался, проверял через EXPLAIN ANALYZE
Время до оптимизации: 274 мсек
После оптимизации: 161 мсек