architect/standards/3-process/process-database-management.md

type: standard
aspect: process
title: "DATABASE MANAGEMENT - СТАНДАРТ"
version: 1.0.0
date: 2026-02-19
status: active


DATABASE MANAGEMENT - СТАНДАРТ

Версия: 1.0.0
Дата: 2026-01-22
Статус: Draft


ПРИНЦИПЫ

1. Одна база на сервис

2. Naming Convention

Базы данных:

{service}_{env}

Примеры:
- platform_ui_prod       ← Production
- platform_ui_dev        ← Development
- platform_ui_test       ← Testing

Таблицы:

{entity} (plural, snake_case)

Примеры:
- users
- tasks
- chat_history
- file_permissions

Колонки:

{field_name} (snake_case)

Примеры:
- created_at
- updated_at
- user_id
- is_active

3. Стандартные поля

Каждая таблица ОБЯЗАТЕЛЬНО:

id              SERIAL PRIMARY KEY
created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP
updated_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Опционально (где нужно):

deleted_at      TIMESTAMP          -- soft delete
created_by      INT                -- кто создал
updated_by      INT                -- кто обновил

4. Миграции

Файлы миграций:

migrations/
├── 001_initial_schema.sql
├── 002_add_roles_table.sql
├── 003_add_permissions.sql
└── ...

Naming: {number}_{description}.sql
Number: 3 цифры, инкрементально

Каждая миграция:
- Должна быть идемпотентной (можно запустить N раз)
- Должна иметь rollback (DOWN миграция)
- Должна быть протестирована на dev

Пример:

-- UP
CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- DOWN (в конце файла, закомментировано)
-- DROP TABLE IF EXISTS users;

5. Индексы

Обязательные индексы:
- Primary key (автоматически)
- Foreign keys
- Поля для WHERE, JOIN

Naming:

idx_{table}_{column}

Примеры:
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_tasks_user_id ON tasks(user_id);

6. Бэкапы

Автоматические:
- Ежедневно в 03:00 UTC
- Retention: 7 дней
- Локация: $INFRA/backups/databases/

Перед критичными изменениями:

pg_dump -U postgres platform_ui_prod > backup_before_migration_$(date +%Y%m%d_%H%M%S).sql

7. Доступ

Пользователи:

platform_ui_app     -- для приложения (CRUD)
platform_ui_ro      -- read-only (для мониторинга)
postgres            -- superuser (только для миграций)

Права:

-- Приложение
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES TO platform_ui_app;

-- Read-only
GRANT SELECT ON ALL TABLES TO platform_ui_ro;

8. Секреты

Хранение:

НЕ в git:
- .env
- credentials.md

В git:
- .env.example (без паролей)
- schema.sql (структура БЕЗ данных)

БАЗА ДЛЯ PLATFORM UI

Название

platform_ui

Схема (v1.0)

users - пользователи системы

id              SERIAL PRIMARY KEY
email           VARCHAR(255) NOT NULL UNIQUE
username        VARCHAR(100) NOT NULL UNIQUE
password_hash   VARCHAR(255) NOT NULL
role            VARCHAR(50) NOT NULL
totp_secret     VARCHAR(100)
is_active       BOOLEAN DEFAULT TRUE
last_login      TIMESTAMP
created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP
updated_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP

roles - роли платформы

id              SERIAL PRIMARY KEY
name            VARCHAR(100) NOT NULL UNIQUE
display_name    VARCHAR(255)
config          JSONB NOT NULL
created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP
updated_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP

tasks - задачи (Kanban)

id              SERIAL PRIMARY KEY
title           VARCHAR(500) NOT NULL
description     TEXT
status          VARCHAR(50) NOT NULL
priority        VARCHAR(50)
assigned_to     INT REFERENCES users(id)
created_by      INT REFERENCES users(id)
due_date        TIMESTAMP
created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP
updated_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP

chat_history - история диалогов с Claude

id              SERIAL PRIMARY KEY
user_id         INT REFERENCES users(id)
role_context    VARCHAR(50)
message         TEXT NOT NULL
response        TEXT NOT NULL
tokens_used     INT
created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP

sessions - активные сессии

id              SERIAL PRIMARY KEY
user_id         INT REFERENCES users(id)
token           VARCHAR(500) NOT NULL UNIQUE
expires_at      TIMESTAMP NOT NULL
created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP

audit_log - лог действий

id              SERIAL PRIMARY KEY
user_id         INT REFERENCES users(id)
action          VARCHAR(100) NOT NULL
resource_type   VARCHAR(100)
resource_id     INT
details         JSONB
ip_address      VARCHAR(50)
created_at      TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Индексы

CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_role ON users(role);
CREATE INDEX idx_tasks_status ON tasks(status);
CREATE INDEX idx_tasks_assigned_to ON tasks(assigned_to);
CREATE INDEX idx_chat_history_user_id ON chat_history(user_id);
CREATE INDEX idx_sessions_token ON sessions(token);
CREATE INDEX idx_sessions_expires_at ON sessions(expires_at);
CREATE INDEX idx_audit_log_user_id ON audit_log(user_id);
CREATE INDEX idx_audit_log_created_at ON audit_log(created_at);

МИГРАЦИИ

Создание миграции

  1. Создать файл migrations/NNN_description.sql
  2. Написать UP и DOWN
  3. Протестировать на dev
  4. Commit в git
  5. Применить на prod

Применение миграции

# Development
psql -U postgres -d platform_ui_dev -f migrations/001_initial_schema.sql

# Production (с бэкапом!)
pg_dump -U postgres platform_ui_prod > backup_before_001.sql
psql -U postgres -d platform_ui_prod -f migrations/001_initial_schema.sql

Rollback

# Раскомментировать DOWN секцию в миграции
psql -U postgres -d platform_ui_prod -f migrations/001_initial_schema.sql
# Восстановить из бэкапа
psql -U postgres -d platform_ui_prod < backup_before_001.sql

МОНИТОРИНГ

Метрики

Алерты


SECURITY

Checklist


ССЫЛКИ