Skip to content

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 и обычные индексы;
  • CHECK constraints;
  • PostgreSQL-специфичные типы, в том числе jsonb;
  • точечные DB::statement(...)-миграции для PostgreSQL-расширений, индексов и ограничений.

На практике это позволяет держать часть инвариантов на уровне самой базы, а не только на уровне PHP-кода.

Например, на уровне БД это может выглядеть так:

sql
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;
  • сопровождение схемы и миграций;
  • эксплуатация БД в составе веб-проекта.

Сайт обновлен и проверен: