45 KiB
Структура базы данных для AI Ассистента
Дата проверки: 2025-10-08
Метод: Прямая проверка через PostgreSQL
Статус: ✅ ПРОВЕРКА ЗАВЕРШЕНА
📊 Список AI таблиц
Найдено таблиц: 27 таблиц (25 связаны с AI, 2 CMS)
1. ai_assistant_settings ⭐ КЛЮЧЕВАЯ
Назначение: Основные настройки AI ассистента
Столбцы:
id- INTEGER (PK) - уникальный идентификаторselected_rag_tables- INTEGER[] - массив ID RAG таблиц для использованияlanguages- TEXT[] - массив поддерживаемых языковupdated_at- TIMESTAMP - время последнего обновления (default: now())updated_by- INTEGER - кто обновил (user_id)rules_id- INTEGER (FK → ai_assistant_rules) - ID правил для AItelegram_settings_id- INTEGER (FK → telegram_settings) - ID настроек Telegramemail_settings_id- INTEGER (FK → email_settings) - ID настроек Emailsystem_prompt_encrypted- TEXT - зашифрованный системный промптmodel_encrypted- TEXT - зашифрованное название моделиsystem_message_encrypted- TEXT - зашифрованное системное сообщениеembedding_model_encrypted- TEXT - зашифрованное название embedding моделиsystem_message- TEXT - системное сообщение (расшифрованное)embedding_model- VARCHAR(128) - embedding модель (расшифрованное)
Связи:
- →
ai_assistant_rules(через rules_id) - →
telegram_settings(через telegram_settings_id) - →
email_settings(через email_settings_id)
Используется в:
- aiAssistantSettingsService.js (getSettings, updateSettings)
- conversationService.js (getRagTableId)
- ai-assistant.js (generateResponse)
- routes/settings.js (API)
2. ai_assistant_rules ✅ АКТИВНАЯ
Назначение: Правила и инструкции для AI ассистента
Столбцы:
id- INTEGER (PK) - уникальный идентификаторcreated_at- TIMESTAMP - дата создания (default: now())updated_at- TIMESTAMP - дата обновления (default: now())name_encrypted- TEXT - зашифрованное название правилаdescription_encrypted- TEXT - зашифрованное описание правилаrules_encrypted- TEXT - зашифрованные правила (JSON) ✅ ДОБАВЛЕНО
Связи:
- ←
ai_assistant_settings.rules_idссылается на эту таблицу
Используется в:
- aiAssistantRulesService.js (getAllRules, getRuleById, createRule)
- ai-assistant.js (получение правил)
- routes/settings.js (CRUD API)
3. ai_providers_settings ⭐ КЛЮЧЕВАЯ
Назначение: Настройки AI провайдеров (Ollama, OpenAI, Anthropic, Google)
Столбцы:
id- INTEGER (PK) - уникальный идентификаторcreated_at- TIMESTAMP NOT NULL - дата создания (default: now())updated_at- TIMESTAMP NOT NULL - дата обновления (default: now())provider_encrypted- TEXT - зашифрованное название провайдера ('ollama', 'openai', etc.)api_key_encrypted- TEXT - зашифрованный API ключbase_url_encrypted- TEXT - зашифрованный базовый URLselected_model_encrypted- TEXT - зашифрованное название выбранной моделиembedding_model_encrypted- TEXT - зашифрованное название embedding моделиembedding_model- VARCHAR(128) - embedding модель (незашифрованное, дублирует?)
Связи:
- Нет внешних ключей
Используется в:
- aiProviderSettingsService.js (getProviderSettings, upsertProviderSettings)
- ollamaConfig.js (loadSettingsFromDb - загружает настройки Ollama)
- ragService.js (getProviderSettings для вызова разных AI)
- routes/settings.js (CRUD API)
4. messages ⭐ КЛЮЧЕВАЯ
Назначение: Все сообщения пользователей и AI ответы
Столбцы:
id- INTEGER (PK) - уникальный идентификаторconversation_id- INTEGER (FK → conversations) - ID беседыsender_id- INTEGER - ID отправителя (для админских сообщений)created_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)user_id- INTEGER (FK → users) - ID пользователя-владельца беседыtokens_used- INTEGER - количество токенов (default: 0)is_processed- BOOLEAN - обработано ли (default: false)attachment_size- BIGINT - размер вложения в байтахattachment_data- BYTEA - бинарные данные вложенияsender_type_encrypted- TEXT - тип отправителя ('user', 'assistant', 'editor')content_encrypted- TEXT - текст сообщенияchannel_encrypted- TEXT - канал ('web', 'telegram', 'email')role_encrypted- TEXT - рольattachment_filename_encrypted- TEXT - имя файлаattachment_mimetype_encrypted- TEXT - MIME типdirection_encrypted- TEXT - направление ('in', 'out')message_id_encrypted- TEXT - ID сообщения для дедупликацииmessage_type- VARCHAR(20) NOT NULL - тип ('user_chat', 'admin_chat')
Индексы:
- idx_messages_conversation_id
- idx_messages_created_at
- idx_messages_message_type
- idx_messages_user_id
Связи:
- →
conversations(ON DELETE CASCADE) - →
users(ON DELETE CASCADE)
Триггеры:
trg_set_message_user_id- автоустановка user_id
Используется в:
- unifiedMessageProcessor.js (saveUserMessage)
- messageDeduplicationService.js (сохранение)
- conversationService.js (история)
- routes/messages.js, routes/chat.js
5. conversations ⭐ КЛЮЧЕВАЯ
Назначение: Беседы (диалоги) пользователей с AI
Столбцы:
id- INTEGER (PK) - уникальный идентификатор беседыuser_id- INTEGER (FK → users) - ID пользователя-владельцаcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)updated_at- TIMESTAMP - дата обновления (default: CURRENT_TIMESTAMP)title_encrypted- TEXT - зашифрованный заголовок беседыconversation_type- VARCHAR(50) - тип беседы (default: 'user_chat')'user_chat'- обычный чат пользователя'admin_chat'- приватный чат между админами
Индексы:
- idx_conversations_conversation_type
- idx_conversations_created_at
- idx_conversations_user_id
Связи:
- →
users(user_id, ON DELETE CASCADE) - ←
conversation_participants(для многопользовательских чатов) - ←
messages(все сообщения беседы)
Используется в:
- conversationService.js (findOrCreateConversation, getConversationHistory)
- unifiedMessageProcessor.js (создание беседы)
- guestMessageService.js (перенос гостевых сообщений)
- routes/messages.js (CRUD беседы)
6. message_deduplication ⭐ КЛЮЧЕВАЯ
Назначение: Предотвращение дублирования сообщений (дедупликация)
Столбцы:
id- INTEGER (PK) - уникальный идентификаторchannel- VARCHAR(20) NOT NULL - канал ('web', 'telegram', 'email')message_id_hash- VARCHAR(64) NOT NULL - SHA-256 хеш IDuser_id- INTEGER NOT NULL (FK → users) - ID пользователяsender_type- VARCHAR(20) NOT NULL - тип отправителя ('user', 'assistant')original_message_id_encrypted- TEXT - оригинальный IDprocessed_at- TIMESTAMP WITH TIME ZONE - время обработки (default: now())expires_at- TIMESTAMP WITH TIME ZONE - время истечения
Индексы:
- idx_message_dedup_expires
- idx_message_dedup_lookup (channel, hash, user_id, sender_type)
- idx_message_dedup_user_channel
- UNIQUE (channel, hash, user_id, sender_type)
Связи:
- →
users(ON DELETE CASCADE)
Используется в:
- messageDeduplicationService.js
- unifiedMessageProcessor.js
- ai-assistant.js
7. guest_messages ✅ АКТИВНАЯ
Назначение: Временное хранение сообщений гостей
Столбцы:
id- INTEGER (PK)is_ai- BOOLEAN - от AI? (default: false)created_at- TIMESTAMP WITH TIME ZONE (default: now())attachment_size- BIGINTattachment_data- BYTEAguest_id_encrypted- TEXT - ID гостя (sessionID)content_encrypted- TEXTlanguage_encrypted- TEXTattachment_filename_encrypted- TEXTattachment_mimetype_encrypted- TEXTattachment_filename- TEXT (дубль?)attachment_mimetype- TEXT (дубль?)
Связи:
- Нет FK (временная)
Используется в:
- guestService.js
- guestMessageService.js (перенос после auth)
Цикл:
- Гость пишет → сохраняется
- Авторизация → перенос в messages
- Удаление из guest_messages
8. guest_user_mapping ✅ АКТИВНАЯ
Назначение: Связь между гостями и зарегистрированными пользователями
Столбцы:
id- INTEGER (PK) - уникальный идентификаторuser_id- INTEGER NOT NULL (FK → users) - ID пользователяprocessed- BOOLEAN - обработаны ли сообщения (default: false)created_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)guest_id_encrypted- TEXT - зашифрованный ID гостя (sessionID)
Индексы:
- idx_guest_user_mapping_guest_id_encrypted - UNIQUE
- idx_guest_user_mapping_user_id
Связи:
- →
users(user_id, ON DELETE CASCADE)
Используется в:
- guestMessageService.js (processGuestMessages - проверка и создание mapping)
Логика:
- При аутентификации гостя создается запись
processed = false→ сообщения еще не перенесеныprocessed = true→ сообщения уже перенесены в messages
9. telegram_settings ✅ АКТИВНАЯ
Назначение: Настройки Telegram бота
Столбцы:
id- INTEGER (PK) - уникальный идентификаторcreated_at- TIMESTAMP NOT NULL - дата создания (default: now())updated_at- TIMESTAMP NOT NULL - дата обновления (default: now())bot_token_encrypted- TEXT - зашифрованный токен Telegram ботаbot_username_encrypted- TEXT - зашифрованное имя бота
Индексы:
- PRIMARY KEY: id
Связи:
- ←
ai_assistant_settings.telegram_settings_idссылается на эту таблицу
Используется в:
- telegramBot.js (loadSettings - загрузка токена)
- botsSettings.js (getTelegramSettings, saveTelegramSettings, testConnection)
- routes/admin (API для настройки Telegram)
10. email_settings ✅ АКТИВНАЯ
Назначение: Настройки Email бота (SMTP + IMAP)
Столбцы:
id- INTEGER (PK) - уникальный идентификаторsmtp_port- INTEGER NOT NULL - порт SMTP (обычно 465)imap_port- INTEGER - порт IMAP (обычно 993)created_at- TIMESTAMP NOT NULL - дата создания (default: now())updated_at- TIMESTAMP NOT NULL - дата обновления (default: now())smtp_host_encrypted- TEXT - зашифрованный хост SMTPsmtp_user_encrypted- TEXT - зашифрованный пользователь SMTPsmtp_password_encrypted- TEXT - зашифрованный пароль SMTPimap_host_encrypted- TEXT - зашифрованный хост IMAPfrom_email_encrypted- TEXT - зашифрованный email отправителяimap_user_encrypted- TEXT - зашифрованный пользователь IMAPimap_password_encrypted- TEXT - зашифрованный пароль IMAP
Индексы:
- PRIMARY KEY: id
Связи:
- ←
ai_assistant_settings.email_settings_idссылается на эту таблицу
Используется в:
- emailBot.js (loadSettings - создание SMTP транспортера и IMAP соединения)
- botsSettings.js (getEmailSettings, saveEmailSettings, testEmailSMTP, testEmailIMAP)
- routes/admin (API для настройки Email)
11. is_rag_source ✅ АКТИВНАЯ
Назначение: Источники данных для RAG (справочник)
Столбцы:
id- INTEGER (PK) - уникальный идентификатор источникаname_encrypted- TEXT - зашифрованное название источника
Индексы:
- PRIMARY KEY: id
Связи:
- ←
user_tables.is_rag_source_idссылается на эту таблицу
Используется в:
- Связывает RAG таблицы с типом источника данных
- user_tables имеет default: is_rag_source_id = 2
Примеры источников:
- ID 1: "FAQ"
- ID 2: "База знаний"
- ID 3: "Документация" (зависит от данных в БД)
12. user_tables ⭐ КЛЮЧЕВАЯ (RAG)
Назначение: Пользовательские таблицы с данными для RAG базы знаний
Столбцы:
id- INTEGER (PK) - уникальный идентификатор таблицыcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)updated_at- TIMESTAMP - дата обновления (default: CURRENT_TIMESTAMP)is_rag_source_id- INTEGER (FK → is_rag_source) - тип источника (default: 2)name_encrypted- TEXT - зашифрованное название таблицыdescription_encrypted- TEXT - зашифрованное описание
Индексы:
- PRIMARY KEY: id
Связи:
- →
is_rag_source(is_rag_source_id) - ←
user_columns(table_id, ON DELETE CASCADE) - ←
user_rows(table_id, ON DELETE CASCADE) - ←
user_table_relations(to_table_id, ON DELETE CASCADE)
Используется в:
- ragService.js (getTableData - получение данных для RAG)
- routes/tables.js (CRUD таблиц)
- routes/rag.js (выбор таблицы для RAG запроса)
Структура RAG:
user_tables (таблица)
└─ user_columns (колонки с purpose)
└─ user_rows (строки)
└─ user_cell_values (значения ячеек)
13. user_columns ⭐ КЛЮЧЕВАЯ (RAG)
Назначение: Колонки пользовательских таблиц с метаданными для RAG
Столбцы:
id- INTEGER (PK) - уникальный идентификатор колонкиtable_id- INTEGER NOT NULL (FK → user_tables) - ID таблицыorder- INTEGER - порядок отображения (default: 0)created_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)updated_at- TIMESTAMP - дата обновления (default: CURRENT_TIMESTAMP)name_encrypted- TEXT - зашифрованное название колонкиtype_encrypted- TEXT - зашифрованный тип ('text', 'number', 'date', etc.)placeholder_encrypted- TEXT - зашифрованный плейсхолдерplaceholder- VARCHAR(255) - плейсхолдер для RAG (UNIQUE)options- JSONB - дополнительные опции (default: '{}')purpose- назначение колонки ('question', 'answer', 'context', 'product', 'priority', 'date')
Индексы:
- PRIMARY KEY: id
- idx_user_columns_options (GIN) - для быстрого поиска по JSONB
- user_columns_placeholder_key (UNIQUE) - уникальность плейсхолдеров
Связи:
- →
user_tables(table_id, ON DELETE CASCADE) - ←
user_table_relations(column_id, ON DELETE CASCADE)
Используется в:
- ragService.js (getTableData - определение колонок по purpose)
- routes/tables.js (CRUD колонок)
Важно для RAG:
options.purposeопределяет роль колонки:- 'question' - вопрос для поиска
- 'answer' - ответ
- 'context' - контекст
- 'product', 'priority', 'date' - метаданные
14. user_rows ⭐ КЛЮЧЕВАЯ (RAG)
Назначение: Строки данных в пользовательских таблицах (записи для RAG)
Столбцы:
id- INTEGER (PK) - уникальный идентификатор строкиtable_id- INTEGER NOT NULL (FK → user_tables) - ID таблицыcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)updated_at- TIMESTAMP - дата обновления (default: CURRENT_TIMESTAMP)order- INTEGER - порядок отображения (default: 0)
Индексы:
- PRIMARY KEY: id
Связи:
- →
user_tables(table_id, ON DELETE CASCADE) - ←
user_cell_values(row_id, ON DELETE CASCADE) - ←
user_table_relations(from_row_id, to_row_id, ON DELETE CASCADE) - ←
user_tag_links(tag_id, ON DELETE CASCADE)
Используется в:
- ragService.js (getTableData - получение всех строк таблицы)
- routes/tables.js (CRUD строк)
Важно:
- Каждая строка = одна запись в RAG (например, один вопрос-ответ)
- Значения хранятся в
user_cell_values
15. user_cell_values ⭐ КЛЮЧЕВАЯ (RAG)
Назначение: Значения ячеек в пользовательских таблицах (данные для RAG)
Столбцы:
id- INTEGER (PK) - уникальный идентификатор значенияrow_id- INTEGER NOT NULL (FK → user_rows) - ID строкиcolumn_id- INTEGER NOT NULL (FK → user_columns) - ID колонки ✅ ИСПРАВЛЕНОcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)updated_at- TIMESTAMP - дата обновления (default: CURRENT_TIMESTAMP)value_encrypted- TEXT - зашифрованное значение ячейки
Индексы:
- PRIMARY KEY: id
- user_cell_values_row_id_column_id_key (UNIQUE) - уникальная пара (row_id, column_id)
Связи:
- →
user_rows(row_id, ON DELETE CASCADE) - →
user_columns(column_id, ON DELETE CASCADE) ✅ ДОБАВЛЕНО
Используется в:
- ragService.js (getTableData - получение всех значений для построения RAG данных)
- routes/tables.js (CRUD значений ячеек)
Как работает RAG:
- ragService получает все cell_values для строк таблицы
- Группирует по row_id
- Находит значения по column_id с нужным purpose (question/answer/context)
- Формирует данные для векторного поиска
16. conversation_participants ✅ АКТИВНАЯ
Назначение: Участники многопользовательских бесед (для admin_chat)
Столбцы:
id- INTEGER (PK) - уникальный идентификаторconversation_id- INTEGER (FK → conversations) - ID беседыuser_id- INTEGER (FK → users) - ID участникаcreated_at- TIMESTAMP - дата добавления (default: CURRENT_TIMESTAMP)
Индексы:
- PRIMARY KEY: id
- conversation_participants_conversation_id_user_id_key (UNIQUE) - пара (conversation_id, user_id)
- idx_conversation_participants_conversation_id
- idx_conversation_participants_user_id
Связи:
- →
conversations(conversation_id, ON DELETE CASCADE) - →
users(user_id, ON DELETE CASCADE)
Используется в:
- routes/messages.js (создание admin_chat бесед между админами)
- routes/chat.js (поиск приватных бесед)
Логика:
- Для обычных чатов (
user_chat) - НЕ используется (один владелец) - Для админских чатов (
admin_chat) - хранит всех участников беседы
17. users ⭐ КРИТИЧЕСКАЯ
Назначение: Пользователи системы (основа для всех AI взаимодействий)
Столбцы:
id- INTEGER (PK) - уникальный идентификатор пользователяcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)updated_at- TIMESTAMP - дата обновления (default: CURRENT_TIMESTAMP)role- user_role ENUM - роль пользователя (default: 'user')- 'user' - обычный пользователь
- 'editor' - администратор-редактор
- 'readonly' - администратор только для чтения
is_blocked- BOOLEAN NOT NULL - заблокирован ли (default: false)blocked_at- TIMESTAMP - время блокировкиusername_encrypted- TEXT - зашифрованное имя пользователяstatus_encrypted- TEXT - зашифрованный статусfirst_name_encrypted- TEXT - зашифрованное имяlast_name_encrypted- TEXT - зашифрованная фамилияpreferred_language- JSONB - предпочитаемый язык
Индексы:
- PRIMARY KEY: id
- idx_users_role
Связи (Referenced by):
- ← conversation_participants (9 таблиц ссылаются!)
- ← conversations
- ← message_deduplication
- ← global_read_status
- ← guest_user_mapping
- ← messages
- ← user_identities
- ← user_preferences
- ← user_tag_links
- ← verification_codes
Используется в:
- identity-service.js (создание пользователей)
- auth-service.js (проверка ролей)
- userUtils.js (isUserBlocked)
- ВСЕ AI сервисы (через связи)
18. user_identities ⭐ КРИТИЧЕСКАЯ
Назначение: Идентификаторы пользователей (wallet, email, telegram)
Столбцы:
id- INTEGER (PK) - уникальный идентификаторuser_id- INTEGER (FK → users) - ID пользователяcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)provider_encrypted- TEXT - зашифрованный провайдер ('wallet', 'email', 'telegram')provider_id_encrypted- TEXT - зашифрованный идентификатор (адрес, email, telegram ID)
Индексы:
- PRIMARY KEY: id
- idx_user_identities_user_id
Связи:
- →
users(user_id, ON DELETE CASCADE)
Используется в:
- identity-service.js (findUserByIdentity, saveIdentity, linkWalletToUser)
- unifiedMessageProcessor.js (authenticateUser - поиск пользователя по Telegram/Email)
- telegramBot.js, emailBot.js (связь external ID с user_id)
- routes/identities.js (управление идентификаторами)
- routes/messages.js (broadcast - поиск каналов пользователя)
Логика:
- Один пользователь может иметь несколько идентификаторов (wallet + email + telegram)
- При входе через любой канал - система находит или создает пользователя
19. global_read_status ✅ АКТИВНАЯ
Назначение: Глобальный статус прочтения сообщений для user_chat
Столбцы:
user_id- INTEGER (PK, FK → users) - ID пользователяlast_read_at- TIMESTAMP NOT NULL - время последнего прочитанного сообщенияupdated_by_admin_id- INTEGER NOT NULL - ID админа, который обновил статусcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)updated_at- TIMESTAMP - дата обновления (default: CURRENT_TIMESTAMP)
Индексы:
- PRIMARY KEY: user_id
- idx_global_read_status_last_read_at
- idx_global_read_status_user_id
Связи:
- →
users(user_id, ON DELETE CASCADE)
Используется в:
- routes/messages.js (mark-read, read-status для user_chat)
Логика:
- Один статус на пользователя (общий для всех админов)
- Для обычных чатов (
user_chat) - Для админских чатов используется
admin_read_messages
20. admin_read_messages ✅ АКТИВНАЯ
Назначение: Персональный статус прочтения для admin_chat
Столбцы:
admin_id- INTEGER NOT NULL (PK, FK → users) - ID администратораuser_id- INTEGER NOT NULL (PK, FK → users) - ID пользователя/другого админаlast_read_at- TIMESTAMP NOT NULL - время последнего прочитанного сообщения
Индексы:
- PRIMARY KEY: (admin_id, user_id) - составной ключ
Связи:
- →
users(admin_id, ON DELETE CASCADE) ✅ ДОБАВЛЕНО - →
users(user_id, ON DELETE CASCADE) ✅ ДОБАВЛЕНО
Используется в:
- routes/messages.js (mark-read, read-status для admin_chat)
Логика:
- Персональный статус для каждого админа
- Для приватных чатов между админами (
admin_chat) - Каждый админ имеет свой статус прочтения
Отличие от global_read_status:
- global_read_status - общий для всех админов (user_chat)
- admin_read_messages - персональный для каждого админа (admin_chat)
21. user_tag_links ✅ АКТИВНАЯ
Назначение: Связь пользователей с тегами (для RAG фильтрации)
Столбцы:
id- INTEGER (PK) - уникальный идентификаторuser_id- INTEGER NOT NULL (FK → users) - ID пользователяtag_id- INTEGER NOT NULL (FK → user_rows) - ID тега (строка из таблицы тегов)created_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)
Индексы:
- PRIMARY KEY: id
- idx_user_tag_links_tag_id
- idx_user_tag_links_user_id
- user_tag_links_user_id_tag_id_key (UNIQUE) - уникальная пара (user_id, tag_id)
Связи:
- →
users(user_id, ON DELETE CASCADE) - →
user_rows(tag_id, ON DELETE CASCADE) - теги хранятся как строки в RAG таблицах
Используется в:
- ragService.js (фильтрация данных по пользовательским тегам)
- routes/tables.js (управление тегами пользователей)
Логика:
- Теги позволяют фильтровать RAG данные по пользователю
- Один пользователь может иметь несколько тегов
- Используется для персонализации AI ответов
22. roles ⚠️ ВОЗМОЖНО УСТАРЕВШАЯ
Назначение: Роли пользователей (возможно старая таблица)
Столбцы:
id- INTEGER (PK) - уникальный идентификаторcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)name_encrypted- TEXT - зашифрованное название роли
Индексы:
- PRIMARY KEY: id
Связи:
- Нет внешних ключей
- Нет Referenced by (никто не ссылается!)
⚠️ ПРОБЛЕМА:
- Таблица существует, но НЕ используется
- В
usersроль хранится как ENUMuser_role, а не FK - Возможно старая таблица, которую можно удалить
Используется в:
- ❌ НЕ найдено использования в коде
23. admin_pages ⚠️ НЕ СВЯЗАНА С AI
Назначение: Страницы контента (CMS), НЕ связана с AI напрямую
Столбцы:
id- INTEGER (PK) - уникальный идентификаторauthor_address_encrypted- TEXT NOT NULL - зашифрованный адрес автораcreated_at- TIMESTAMP - дата создания (default: now())updated_at- TIMESTAMP - дата обновления (default: now())title_encrypted- TEXT - зашифрованный заголовокsummary_encrypted- TEXT - зашифрованное краткое описаниеcontent_encrypted- TEXT - зашифрованное содержимоеseo_encrypted- TEXT - зашифрованные SEO данныеstatus_encrypted- TEXT - зашифрованный статусsettings_encrypted- TEXT - зашифрованные настройки
Индексы:
- PRIMARY KEY: id
Связи:
- Нет внешних ключей
Используется в:
- routes/pages.js (CMS система)
- ❌ НЕ используется в AI сервисах
Примечание:
- Это таблица для CMS (система управления контентом)
- НЕ связана с AI ассистентом
- Упомянута в вашем списке, но к AI не относится
24. admin_pages_simple ⚠️ НЕ СВЯЗАНА С AI
Назначение: Упрощенные страницы контента БЕЗ шифрования, НЕ связана с AI
Столбцы:
id- INTEGER (PK) - уникальный идентификаторauthor_address- TEXT NOT NULL - адрес автора (НЕ зашифрован!)created_at- TIMESTAMP - дата создания (default: now())updated_at- TIMESTAMP - дата обновления (default: now())title- TEXT - заголовок (НЕ зашифрован!)summary- TEXT - краткое описаниеcontent- TEXT - содержимоеseo- TEXT - SEO данныеstatus- TEXT - статусsettings- TEXT - настройки
Индексы:
- PRIMARY KEY: id
Связи:
- Нет внешних ключей
Используется в:
- routes/pages.js (CMS система)
- ❌ НЕ используется в AI сервисах
Примечание:
- Это таблица для CMS (система управления контентом)
- В отличие от
admin_pages, данные НЕ зашифрованы - НЕ связана с AI ассистентом
- Упомянута в вашем списке, но к AI не относится
25. user_table_relations ⭐ КЛЮЧЕВАЯ (RAG)
Назначение: Связи между строками в разных RAG таблицах (реляционная модель данных)
Столбцы:
id- INTEGER (PK) - уникальный идентификатор связиfrom_row_id- INTEGER NOT NULL (FK → user_rows) - исходная строкаcolumn_id- INTEGER NOT NULL (FK → user_columns) - колонка со связьюto_table_id- INTEGER NOT NULL (FK → user_tables) - целевая таблицаto_row_id- INTEGER NOT NULL (FK → user_rows) - целевая строкаcreated_at- TIMESTAMP - дата создания (default: CURRENT_TIMESTAMP)updated_at- TIMESTAMP - дата обновления (default: CURRENT_TIMESTAMP)
Индексы:
- PRIMARY KEY: id
- idx_user_table_relations_column
- idx_user_table_relations_from_row
- idx_user_table_relations_to_row
- idx_user_table_relations_to_table
Связи:
- →
user_columns(column_id, ON DELETE CASCADE) - →
user_rows(from_row_id, ON DELETE CASCADE) - →
user_rows(to_row_id, ON DELETE CASCADE) - →
user_tables(to_table_id, ON DELETE CASCADE)
Используется в:
- routes/tables.js (создание связей между данными)
- ragService.js (получение связанных данных для контекста)
Логика:
- Позволяет создавать связи "один-ко-многим" и "многие-ко-многим" между RAG данными
- Пример: FAQ вопрос → связанные продукты, документы → связанные разделы
- Используется для обогащения контекста AI ответов
Структура связи:
user_rows[from_row_id]
→ user_columns[column_id] (тип: "relation")
→ user_tables[to_table_id]
→ user_rows[to_row_id]
26. admin_read_contacts ✅ АКТИВНАЯ
Назначение: Статус прочтения контактов админами (для UI непрочитанных пользователей)
Столбцы:
admin_id- INTEGER NOT NULL (PK, FK → users) - ID администратораcontact_id- INTEGER NOT NULL (PK, FK → users) - ID контакта (user_id)read_at- TIMESTAMP NOT NULL - время прочтения (default: now())
Индексы:
- PRIMARY KEY: (admin_id, contact_id) - составной ключ
Связи:
- →
users(admin_id, ON DELETE CASCADE) ✅ ДОБАВЛЕНО - →
users(contact_id, ON DELETE CASCADE) ✅ ДОБАВЛЕНО
Используется в:
- routes/messages.js (mark-contact-read - отметить контакт как прочитанный)
- adminLogicService.js (управление непрочитанными контактами)
Логика:
- Отслеживает, когда админ последний раз просматривал чат пользователя
- Используется для отображения непрочитанных контактов в списке
- Отличается от
global_read_status(статус сообщений) иadmin_read_messages(приватные чаты)
Применение:
- UI показывает список пользователей с новыми сообщениями
- Когда админ открывает чат → обновляется
read_at - Новые сообщения после
read_at= непрочитанные
27. user_preferences ✅ АКТИВНАЯ
Назначение: Пользовательские настройки и предпочтения (может влиять на AI)
Столбцы:
id- INTEGER (PK) - уникальный идентификаторuser_id- INTEGER NOT NULL (FK → users) - ID пользователяcreated_at- TIMESTAMP NOT NULL - дата создания (default: now())updated_at- TIMESTAMP NOT NULL - дата обновления (default: now())preference_key_encrypted- TEXT - зашифрованный ключ настройкиpreference_value_encrypted- TEXT - зашифрованное значение настройкиmetadata- JSONB - дополнительные метаданные (default: '{}')
Индексы:
- PRIMARY KEY: id
- idx_user_preferences_user_id
Связи:
- →
users(user_id, ON DELETE CASCADE) ✅ ИСПРАВЛЕНО
Используется в:
- routes/preferences.js (CRUD настроек)
- Может использоваться для персонализации AI ответов
Возможные настройки:
- Язык интерфейса
- Тема оформления
- Уведомления
- Персональные предпочтения для AI (стиль общения, детальность ответов)
Примечание:
- В таблице
usersуже естьpreferred_language(JSONB) user_preferences- более гибкая система для любых настроек- Может расширяться для AI-специфичных настроек
28. unified_guest_messages ⭐ НОВАЯ (2025-10-09)
Назначение: Централизованное хранилище сообщений гостей для всех каналов
Столбцы:
id- SERIAL PRIMARY KEYidentifier_encrypted- TEXT NOT NULL - зашифрованный универсальный идентификатор ("channel:id")channel- VARCHAR(20) NOT NULL - канал ('web', 'telegram', 'email')content_encrypted- TEXT NOT NULL - зашифрованный текст сообщенияis_ai- BOOLEAN NOT NULL DEFAULT false - TRUE если ответ AI, FALSE если от гостяmetadata- JSONB DEFAULT '{}' - метаданные канала (username, chat_id и т.д.)created_at- TIMESTAMP WITH TIME ZONE DEFAULT NOW()attachment_filename_encrypted- TEXTattachment_mimetype_encrypted- TEXTattachment_size- BIGINTattachment_data- BYTEA
Индексы:
- idx_unified_guest_identifier
- idx_unified_guest_channel
- idx_unified_guest_created_at
- idx_unified_guest_is_ai
Связи:
- Нет FK (временное хранилище до авторизации)
Используется в:
- UniversalGuestService.js (сохранение/загрузка истории)
- unifiedMessageProcessor.js (обработка гостевых сообщений)
Логика:
- Заменяет старую таблицу
guest_messages - Работает для ВСЕХ каналов (web, telegram, email)
- Сохраняет как вопросы гостей (is_ai=false), так и ответы AI (is_ai=true)
- При подключении кошелька - данные мигрируют в
messages
29. identity_link_tokens ⭐ НОВАЯ (2025-10-09)
Назначение: Токены для связывания Telegram/Email с Web3 кошельками
Столбцы:
id- SERIAL PRIMARY KEYtoken- VARCHAR(64) UNIQUE NOT NULL - уникальный токенsource_provider- VARCHAR(20) NOT NULL - провайдер ('telegram', 'email')source_identifier_encrypted- TEXT NOT NULL - зашифрованный ID источникаuser_id- INTEGER FK → users - опциональный user_idis_used- BOOLEAN NOT NULL DEFAULT false - флаг использованияused_at- TIMESTAMP WITH TIME ZONE - время использованияlinked_wallet- TEXT - адрес привязанного кошелькаexpires_at- TIMESTAMP WITH TIME ZONE NOT NULL - время истечения (TTL)created_at- TIMESTAMP WITH TIME ZONE DEFAULT NOW()
Индексы:
- idx_link_tokens_token (UNIQUE)
- idx_link_tokens_expires
- idx_link_tokens_used
- idx_link_tokens_provider
Связи:
- →
users(user_id, ON DELETE CASCADE)
Используется в:
- IdentityLinkService.js (генерация/проверка токенов)
- routes/auth.js (подключение кошелька через токен)
- routes/identities.js (проверка статуса токена)
Логика:
- Telegram/Email бот генерирует токен и ссылку
- Пользователь переходит по ссылке и подключает кошелек
- Токен связывает Telegram/Email с wallet без дубликатов
- TTL 1 час, после использования помечается is_used=true
30. unified_guest_mapping ⭐ НОВАЯ (2025-10-09)
Назначение: Маппинг между гостевыми идентификаторами и пользователями
Столбцы:
id- SERIAL PRIMARY KEYuser_id- INTEGER NOT NULL FK → usersidentifier_encrypted- TEXT NOT NULL - зашифрованный идентификатор ("channel:id")channel- VARCHAR(20) NOT NULL - канал ('web', 'telegram', 'email')processed- BOOLEAN NOT NULL DEFAULT false - флаг миграцииprocessed_at- TIMESTAMP WITH TIME ZONE - время миграцииcreated_at- TIMESTAMP WITH TIME ZONE DEFAULT NOW()
Индексы:
- idx_unified_mapping_user_id
- idx_unified_mapping_identifier
- idx_unified_mapping_processed
- idx_unified_mapping_channel
- UNIQUE(identifier_encrypted, channel)
Связи:
- →
users(user_id, ON DELETE CASCADE)
Используется в:
- UniversalGuestService.js (маппинг при миграции)
Логика:
- Создается при миграции гостевой истории в user_id
- UNIQUE constraint предотвращает дубликаты
- processed=true означает что сообщения уже мигрированы
📊 ИТОГОВАЯ СТАТИСТИКА
Всего проверено: 30 таблиц
По категориям:
- ⭐ КРИТИЧЕСКИЕ: 4 (users, user_identities, messages, conversations)
- ⭐ КЛЮЧЕВЫЕ: 13 (ai_assistant_settings, ai_providers_settings, message_deduplication, user_tables, user_columns, user_rows, user_cell_values, user_table_relations, unified_guest_messages ✨, identity_link_tokens ✨, unified_guest_mapping ✨)
- ✅ АКТИВНЫЕ: 10 (ai_assistant_rules, telegram_settings, email_settings, is_rag_source, conversation_participants, global_read_status, admin_read_messages, user_tag_links, admin_read_contacts, user_preferences)
- ⚠️ ПРОБЛЕМНЫЕ: 1 (roles - не используется)
- ⚠️ НЕ СВЯЗАНЫ С AI: 2 (admin_pages, admin_pages_simple)
Обнаруженные проблемы:
1.✅ ИСПРАВЛЕНО (миграция 064)ai_assistant_rules- отсутствует столбецrules_encrypted2.✅ ИСПРАВЛЕНО (миграция 065)user_cell_values- нет FK наuser_columns(column_id)-
roles- таблица существует, но не используется ⚠️ НИЗКИЙ ПРИОРИТЕТ
4.✅ ИСПРАВЛЕНО (миграция 066)admin_read_messages- нет FK на users5.✅ ИСПРАВЛЕНО (миграция 066)admin_read_contacts- нет FK на users6.✅ ИСПРАВЛЕНО (миграция 067)user_preferences- нет ON DELETE CASCADE для user_id
Применённые миграции:
- 064_add_rules_encrypted_to_ai_assistant_rules.sql
- 065_add_fk_user_cell_values_column_id.sql
- 066_add_fk_admin_read_tables.sql
- 067_add_cascade_user_preferences.sql
- 068_create_unified_guest_messages.sql ✨ НОВАЯ (2025-10-09)
- 069_create_identity_link_tokens.sql ✨ НОВАЯ (2025-10-09)
- 070_create_unified_guest_mapping.sql ✨ НОВАЯ (2025-10-09)
- 071_cleanup_test_data.sql ⚠️ ОЧИСТКА ДАННЫХ (2025-10-09)
- 072_migrate_existing_guest_data.sql ✨ МИГРАЦИЯ (2025-10-09)
Дата проверки: 2025-10-08
Дата исправлений: 2025-10-08
Дата обновления: 2025-10-09 (Универсальная гостевая система)
Статус: ✅ ПРОВЕРКА ЗАВЕРШЕНА + КРИТИЧНЫЕ ПРОБЛЕМЫ ИСПРАВЛЕНЫ + НОВАЯ СИСТЕМА ГОСТЕЙ