PostgreSQL / MySQL
PostgreSQL
Работал с базой данных PostgreSQL как основной реляционной БД в backend-проектах.
Использовал следующие возможности в работе:
- проектирование структуры таблиц и связей;
- написание миграций и поддержка схемы БД;
- индексы, ограничения целостности и уникальности;
- типы
jsonb,uuid; - PostgreSQL-специфичный поиск и индексы, включая
pg_trgmиGIN; - эксплуатация
PostgreSQLв Docker-окружении; - backup / restore и сопровождение production-базы.
Проектирование схемы
При проектировании таблиц использовал:
- первичные ключи на
bigintиuuid; - внешние ключи и каскадное удаление;
- составные
unique-ограничения; - отдельные индексы под частые выборки;
- хранение структурированных данных в
jsonb; - использование PostgreSQL-специфичных индексов под fuzzy/full-text-like поиск.
Миграции и ограничения целостности
Писал миграции не только на уровне базовых Schema-операций, но и на уровне SQL-ограничений самой БД.
Что использовал:
foreign keyсвязи;uniqueи обычные индексы;CHECKconstraints;- PostgreSQL-специфичные типы, в том числе
jsonb; - точечные
DB::statement(...)-миграции для PostgreSQL-расширений, индексов и ограничений.
На практике это позволяет держать часть инвариантов на уровне самой базы, а не только на уровне PHP-кода.
Например, на уровне БД это может выглядеть так:
CHECK (
(type = 'string' AND value_string IS NOT NULL AND value_number IS NULL AND value_boolean IS NULL AND value_json IS NULL) OR
(type = 'number' AND value_string IS NULL AND value_number IS NOT NULL AND value_boolean IS NULL AND value_json IS NULL) OR
(type = 'boolean' AND value_string IS NULL AND value_number IS NULL AND value_boolean IS NOT NULL AND value_json IS NULL) OR
(type = 'json' AND value_string IS NULL AND value_number IS NULL AND value_boolean IS NULL AND value_json IS NOT NULL)
)Комментарий: если type = 'boolean', то заполнено должно быть только поле value_boolean, а остальные value-колонки обязаны оставаться NULL. Это не даёт записать в строку одновременно несколько значений разных типов и переносит часть валидации на уровень самой БД.
JSONB и гибкие структуры данных
Есть опыт использования jsonb в PostgreSQL для случаев, когда часть данных естественно хранить в полуструктурированном виде.
Что это обычно даёт:
- более гибкую модель хранения;
- возможность не раздувать схему второстепенными полями;
- сохранение преимуществ PostgreSQL как реляционной БД рядом с JSON-данными.
Индексы и производительность
Есть опыт проектирования индексов для целей:
- индексы под частые фильтры;
- составные индексы под сочетания полей;
unique-индексы как часть модели данных;- разделение индексов для целостности и для производительности.
SQL и прикладные запросы
Есть опыт работы с SQL на уровне прикладной разработки:
- выборки, агрегации и отчёты;
- соединения таблиц;
- подготовка запросов под backend-логику;
- использование raw SQL там, где ORM-уровня недостаточно;
ILIKE,similarity(...),word_similarity(...)и кастомное ранжирование в поисковых запросах.
Docker и эксплуатация PostgreSQL
Есть опыт работы с PostgreSQL как с инфраструктурным сервисом внутри Docker-схемы:
- отдельный контейнер БД в
docker compose; - persistent volume для данных;
- переменные окружения для инициализации БД;
- healthcheck на готовность сервиса;
- работа с актуальной production-like конфигурацией на
PostgreSQL 17; - использование отдельной тестовой БД;
- работа с БД как в локальном окружении, так и в production Docker-схеме.
Такой подход удобен тем, что среда воспроизводима, а поведение БД между разработкой, тестированием и production остаётся предсказуемым.
Backup / Restore и production-сопровождение
Настраивал сопровождение production PostgreSQL, включая процессы:
- резервное копирование через
pg_dump; - использование
custom format(pg_dump -Fc); - архивирование backup-артефактов;
- ручной и автоматический запуск backup-задач;
- восстановление через
pg_restore; - контроль сроков хранения резервных копий.
MySQL
Также есть опыт работы с MySQL.
В основном это тот же класс задач, который уже описан выше для PostgreSQL:
- проектирование таблиц и связей;
- индексы и ограничения;
- прикладные SQL-запросы;
- работа через ORM и query builder;
- сопровождение схемы и миграций;
- эксплуатация БД в составе веб-проекта.