# ADR-001: Выбор PostgreSQL как основной СУБД **Статус:** принято **Дата:** 2026-05-10 --- ## Контекст Для проекта VoIdea требуется база данных с поддержкой: - Сложных запросов (аналитика идей) - JSONB для гибкости (метаданные, настройки) - ACID транзакции (финансовые операции, подписки) - Масштабируемость (тысячи пользователей) - Хорошая работа с Python (asyncpg) Рассматривались: - **PostgreSQL** — реляционная, ACID, JSONB, mature - **MongoDB** — документоориентированная, гибкость, шардинг - **SQLite** — простая, не подходит для production --- ## Решение **PostgreSQL** выбран как основная СУБД. ### Обоснование | Критерий | PostgreSQL | MongoDB | SQLite | |----------|------------|---------|--------| | ACID | ✅ Полный | ❌ Eventual | ✅ Полный | | JSONB | ✅ Отличный | ✅ Лучший | ❌ Limited | | Масштабируемость | ✅ Хорошая | ✅ Отличная | ❌ Плохая | | Python async | ✅ asyncpg | ✅ motor | ❌ | | Сложные запросы | ✅ Отличные | ❌ Limited | ⚠️ Basic | | Зрелость | ✅ 20+ лет | ⚠️ 15 лет | ✅ | ### Преимущества для VoIdea 1. **JSONB** — хранение зашифрованных данных, настроек агентов 2. **ACID** — безопасность транзакций (подписки, платежи) 3. **Индексы** — поиск по метаданным, пользователям 4. **PostGIS** — геолокация (future: автоопределение региона) 5. **Full-text search** — поиск в идеях --- ## Последствия ### Положительные - Надёжная, проверенная база данных - Отличная производительность - Большое сообщество - Хорошая документация - Mature ORM (SQLAlchemy async) ### Отрицательные - Требует установку и настройку (PostgreSQL server) - Миграции Alembic для схемы - Начальная настройка (создание пользователя, базы) ### Миграция Для локальной разработки: ```bash # Windows # Скачать PostgreSQL с postgresql.org/download/windows # или использовать Chocolatey: choco install postgresql # Ubuntu (VPS) apt install postgresql postgresql-contrib ``` --- ## Реализация ### Конфигурация в .env ```bash DB_HOST=localhost DB_PORT=5432 DB_NAME=voidea DB_USER=voidea DB_PASS=your_secure_password ``` ### SQLAlchemy async setup ```python from sqlalchemy.ext.asyncio import create_async_engine engine = create_async_engine( f"postgresql+asyncpg://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}", echo=True ) ``` --- ## Ответственный **Decision maker:** Owner **Review date:** При масштабировании (> 10,000 пользователей) --- *Создано: 2026-05-10* *Обновлено при изменениях SpecAgent*