добавил таблицу connections_state и тригер который ведёт в ней актуальное состояние всех связей! (и всё рабоатет - тесты проходят)
9.9 KiB
- Перечень таблиц и кратко о каждой
solana_users — справочник пользователей: логин + ключ устройства + (опционально) Solana-ключ. База для FK почти во всех таблицах. active_sessions — активные сессии авторизации/работы клиента: пароли сессии/хранилища, времена, push-данные, IP/инфо клиента. users_params — “последние значения параметров” пользователя. Для каждого (login,param) хранится актуальная версия по time_ms (старые обновления игнорируются). ip_geo_cache — кеш геолокации по IP, чтобы не дергать внешние сервисы постоянно. blockchain_state — агрегатное состояние блокчейна по blockchainName: лимиты/размер, последний глобальный блок и последние блоки по линиям 0..7. blocks — локальное хранилище блоков/сообщений: привязка к пользователю и блокчейну, номера/хэши, тип/подтип, тело блока (BLOB), и опциональная “ссылка на другой блок” через поля to*. (PK сейчас намеренно убран.)
- Таблицы подробно: параметры по строкам
solana_users
login — TEXT PK — уникальный логин пользователя. deviceKey — TEXT NOT NULL — публичный ключ устройства (обычно Base64(32) или HEX(64)). solanaKey — TEXT NULL — публичный ключ Solana-аккаунта (если используется).
active_sessions
sessionId — TEXT PK — идентификатор сессии (строка; по смыслу base64(32)). login — TEXT NOT NULL, FK → solana_users(login) — владелец сессии. sessionPwd — TEXT NOT NULL — пароль/секрет сессии (как хранится — строкой). storagePwd — TEXT NOT NULL — пароль/секрет для storage (как хранится — строкой). sessionCreatedAtMs — INTEGER NOT NULL — время создания сессии (Unix ms). lastAuthirificatedAtMs — INTEGER NOT NULL — время последней авторизации/refresh (Unix ms). pushEndpoint — TEXT NULL — endpoint для WebPush. pushP256dhKey — TEXT NULL — p256dh ключ для WebPush. pushAuthKey — TEXT NULL — auth ключ для WebPush. clientIp — TEXT NULL — IP клиента на auth/refresh. clientInfoFromClient — TEXT NULL — строка, присланная клиентом (PWA). clientInfoFromRequest — TEXT NULL — строка, собранная сервером из запроса. userLanguage — TEXT NULL — язык пользователя (например ru-RU).
users_params
login — TEXT NOT NULL, FK → solana_users(login) — владелец параметра. param — TEXT NOT NULL — имя параметра (ключ). time_ms — INTEGER NOT NULL — версия/время параметра (Unix ms), используется для “только если новее”. value — TEXT NOT NULL — значение параметра. device_key — TEXT NULL — каким ключом подписано (если используешь), строковый формат. signature — TEXT NULL — подпись (если используешь), строковый формат.
Ограничение: UNIQUE(login, param) — один актуальный параметр на пару.
ip_geo_cache
ip — TEXT PK — IP-адрес (строкой). geo — TEXT NULL — гео-строка (Country/City или как договоритесь). updated_at_ms — INTEGER NOT NULL — когда кеш обновлялся (Unix ms).
blockchain_state
blockchainName — TEXT PK — имя/ID блокчейна (уникальное). login — TEXT NOT NULL, FK → solana_users(login) — владелец блокчейна. blockchainKey — TEXT NOT NULL — публичный ключ блокчейна (по смыслу Base64(32)). size_limit — INTEGER NOT NULL — лимит размера (по смыслу bytes; в Java это long). file_size_bytes — INTEGER NOT NULL — текущий размер файла блокчейна в байтах. last_global_number — INTEGER NOT NULL — последний глобальный номер блока (genesis = -1). last_global_hash — TEXT NOT NULL — хэш последнего глобального блока (или пустая строка). updated_at_ms — INTEGER NOT NULL — время обновления состояния (Unix ms).
Линии 0..7 (для каждой линии две колонки): line0_last_number — INTEGER NOT NULL — последний номер в линии 0. line0_last_hash — TEXT NOT NULL — последний хэш в линии 0. line1_last_number — INTEGER NOT NULL — последний номер в линии 1. line1_last_hash — TEXT NOT NULL — последний хэш в линии 1. line2_last_number — INTEGER NOT NULL — последний номер в линии 2. line2_last_hash — TEXT NOT NULL — последний хэш в линии 2. line3_last_number — INTEGER NOT NULL — последний номер в линии 3. line3_last_hash — TEXT NOT NULL — последний хэш в линии 3. line4_last_number — INTEGER NOT NULL — последний номер в линии 4. line4_last_hash — TEXT NOT NULL — последний хэш в линии 4. line5_last_number — INTEGER NOT NULL — последний номер в линии 5. line5_last_hash — TEXT NOT NULL — последний хэш в линии 5. line6_last_number — INTEGER NOT NULL — последний номер в линии 6. line6_last_hash — TEXT NOT NULL — последний хэш в линии 6. line7_last_number — INTEGER NOT NULL — последний номер в линии 7. line7_last_hash — TEXT NOT NULL — последний хэш в линии 7.
blocks
login — TEXT NOT NULL, FK → solana_users(login) — чей блок (логин). bchName — TEXT NOT NULL, FK → blockchain_state(blockchainName) — к какому блокчейну относится блок. blockGlobalNumber — INTEGER NOT NULL — глобальный номер блока. blockGlobalPreHashe — TEXT NOT NULL — хэш предыдущего глобального блока. blockLineIndex — INTEGER NOT NULL — индекс линии (0..7), по смыслу int16. blockLineNumber — INTEGER NOT NULL — номер блока в линии. blockLinePreHashe — TEXT NOT NULL — хэш предыдущего блока в линии. msgType — INTEGER NOT NULL — общий тип сообщения/блока (по смыслу uint16). msgSubType — INTEGER NOT NULL — подтип внутри msgType (по смыслу uint16). blockByte — BLOB NULL — сырой байтовый блок/тело сообщения.
Ссылка на другой блок (nullable, для ответов/репостов/связей и т.п.): to_login — TEXT NULL — логин “на кого/кому/с кем” (смысловая цель). toBchName — TEXT NULL — целевой блокчейн. toBlockGlobalNumber — INTEGER NULL — целевой глобальный номер. toBlockHashe — TEXT NULL — хэш целевого блока.
connections_state ⭐ Текущее состояние связей пользователя. login — TEXT NOT NULL — владелец связи. relType — INTEGER NOT NULL — тип связи: 10 = FRIEND, 20 = CONTACT, 30 = FOLLOW. to_login — TEXT NOT NULL — с кем связь. toBchName — TEXT NOT NULL — блокчейн цели. toBlockGlobalNumber — INTEGER NULL — последний известный номер блока цели. toBlockHashe — TEXT NULL — последний известный хэш блока цели. Ограничение: UNIQUE(login, relType, to_login) — одно актуальное состояние связи.
- Триггер логики связей
Триггер trg_blocks_connection_state_ai срабатывает AFTER INSERT ON blocks: если msgType = 3 (ConnectionBody) msgSubType IN (10,20,30) → добавить или обновить запись в connections_state msgSubType IN (11,21,31) → удалить соответствующую связь (10/20/30) повторные добавления и удаления не вызывают ошибок Таким образом: blocks — журнал событий connections_state — всегда актуальное состояние
Индексы (кратко, чтобы было понятно зачем) idx_solana_users_login(login) — быстрый поиск по логину. idx_active_sessions_login(login) — быстро получить сессии пользователя. idx_users_params_login(login) — быстро получить параметры пользователя. idx_ip_geo_cache_updated_at(updated_at_ms) — чистка старых записей. idx_blockchain_state_login(login) — блокчейны пользователя. idx_blockchain_state_updated_at(updated_at_ms) — выборки/обслуживание по “свежести”. idx_blocks_chain_global(login,bchName,blockGlobalNumber) — выборки блоков по цепочке. idx_blocks_to_target(to_login,toBchName,toBlockGlobalNumber) — быстрые выборки “по ссылке”.