Управление данными
Новый раздел
Этот раздел добавлен как дополнение к исходной структуре — конвенции работы с данными критичны для консистентности и масштабирования.
Принципы
- Database per Service — каждый сервис владеет своей БД
- Нет прямых запросов к чужим БД — только через API или события
- Миграции в коде — версионированные, идемпотентные, откатываемые
- Data ownership — у каждой сущности есть сервис-владелец
Конвенции именования
Таблицы
sql
-- snake_case, множественное число
users
payment_transactions
order_itemsКолонки
sql
-- snake_case
id -- UUID, primary key
created_at -- timestamp with time zone
updated_at -- timestamp with time zone
deleted_at -- soft delete (nullable)
user_id -- foreign key: <entity>_id
status -- enum через CHECK constraint или отдельная таблицаИндексы
sql
-- idx_<table>_<columns>
idx_users_email
idx_payment_transactions_user_id_created_atМиграции
Инструменты
Правила
- Миграции только вперёд — никаких ручных ALTER TABLE
- Каждая миграция имеет
upиdown - Миграция не должна ломать работающий сервис (zero-downtime)
- Большие миграции — через expand-contract паттерн
Expand-Contract Pattern
Шаг 1 (expand): Добавить новую колонку (nullable)
Шаг 2 (migrate): Мигрировать данные, обновить код
Шаг 3 (contract): Удалить старую колонкуБэкапы
| Параметр | Значение |
|---|---|
| Частота | Ежедневные full, hourly incremental |
| Хранение | 30 дней |
| Тестирование | Ежемесячный restore test |
| RPO | < 1 час |
| RTO | < 4 часа |
Чувствительные данные
- PII (имя, email, телефон) — шифрование at rest
- Данные карт — не хранятся (токенизация)
- Логи — маскирование PII
- Доступ к продакшен БД — через audit trail