# PostgreSQL runtime schema v1 Дата фиксации: `2026-07-24` ## Назначение Это целевая серверная runtime-схема PostgreSQL для SHiNE без опоры на SQLite. Схема `v1` нужна как стартовая точка большого механического переноса DAO и runtime-запросов с существующей SQLite-логики на PostgreSQL. ## Ключевые решения - Источник истины по пользователям: `solana_user_pda_current`. - Legacy-таблицы старого runtime для пользователей и личных сообщений в новой схеме не создаются. - Основная таблица серверных личных сообщений: `signed_messages`. - Таблица `blockchain_state` сохраняется как runtime-state таблица сервера: она не является identity-слоем и не мигрируется как legacy SQLite data. - Триггеры по `blocks` сохраняются и переписываются под PostgreSQL. ## Таблицы sync-модуля Solana users - `solana_sync_state` - `solana_sync_tx_history` - `solana_user_pda_current` - `solana_user_pda_history` ## Таблицы server runtime - `db_schema_version` - `active_sessions` - `esp_pairing_settings` - `esp_pairing_requests` - `users_params` - `ip_geo_cache` - `test_free_avatar_uploads` - `sync_servers` - `blockchain_state` - `blocks` - `connections_state` - `message_stats` - `reactions_state` - `channel_names_state` - `chat200_state` - `chat200_members_state` - `user_push_tokens` - `signed_direct_message_replay` - `signed_direct_messages_history` - `signed_messages` - `signed_message_session_delivery` ## Триггеры Схема `v1` уже включает PostgreSQL-версии триггеров: - `trg_blocks_line_integrity_bi` - `trg_blocks_connection_state_ai` - `trg_blocks_message_stats_like_ai` - `trg_blocks_message_stats_reply_ai` - `trg_blocks_edit_apply_ai` ## Что не входит в v1 - полная зачистка legacy-документации, старых названий и TODO-хвостов; - переименование Java DAO/классов `*V2` в runtime-коде; - перенос прямых SQL-запросов из хэндлеров в DAO/service; - переключение всего runtime-кода на новый `DbProvider`. Это отдельные механические шаги поверх уже утверждённой схемы. ## Совместимость со старыми блоками каналов В runtime-сервере сознательно нет жёсткой серверной проверки `channelName must not contain only digits`. Причина: в уже существующей истории блокчейна есть каналы с числовыми именами, и при холодном восстановлении сервера с пустой БД и без `.bch` такие блоки должны успешно переигрываться от других sync-серверов. Сейчас правило "новый публичный канал не должен состоять только из цифр" остаётся на уровне UI/продуктовых требований и должно быть позже возвращено на сервере отдельным совместимым способом, который не ломает replay исторических блоков. ## Инициализация пустой БД Если сервер подключается к PostgreSQL через `db.url=jdbc:postgresql:...` и в выбранной БД ещё нет таблицы `db_schema_version`, он сам автоматически накатывает `schema_v1.sql` из classpath-ресурса: - ресурс: `shine-server-db/src/main/resources/postgres/schema_v1.sql` - признак пустой схемы: отсутствует `db_schema_version` - стартовая версия схемы: `1`