🗄️ Структура базы данных

Версия: 1.4 | Обновлено: 2026-11-02

📋 Таблица news

ПолеТипНазначение
idintPRIMARY KEY AUTO_INCREMENT
titlevarchar(255)Заголовок новости
seo_titlevarchar(255)SEO-заголовок
statusenumdraft / published / archived
datetimestampДата новости (публикации)
source_namevarchar(255)Название источника
contentlongtextОсновной текст новости
descriptionvarchar(500)Короткое описание (тизер для ленты и meta-description) — ✅ реализовано
created_attimestampДата создания
updated_attimestampДата обновления
contextlongtextПредыстория, причины события
timelinelongtextХронология событий (JSON массив)
developmentlongtextРазвитие ситуации после публикации
expert_commentlongtextКомментарий редакции
speaker_noteslongtextПометки для ведущего (не публикуются)
ai_suggestionslongtextВарианты подачи от AI (JSON)
ai_loglongtextJSON-лог всех AI-действий (предложения, поиски, обновления)
statusvarcharРедакционный статус: draft / published / archived
enrichment_statusvarcharСтатус обогащения: pending / processing / completed / failed / skipped
enriched_atdatetimeДата последнего успешного обогащения
enrichment_versionvarchar(100)Версия обработчика обогащения
enrichment_errortextПоследняя ошибка обогащения
source_urlslongtextДополнительные источники (JSON)
importancetinyintВажность (0–10), финальное значение
sentimentenumpositive / negative / neutral / mixed; ИИ-обогащением не изменяется
selected_presentationvarchar(20)Выбранный вариант подачи (fact/story/analytics)

📥 Таблица content_source_events

Единственный источник истины для исходного сообщения, канала поступления и технического жизненного цикла.

ПолеНазначение
news_idСвязь с материализованной новостью
source_id / source_keyНастроенный источник
source_kind / source_driverТип и транспорт источника
external_id / external_group_idИдентификаторы сообщения и медиагруппы
source_published_at / source_order_keyИсходная дата и стабильный порядок
raw_payloadНеизменяемый оригинальный вход
normalized_payloadКанонический payload после адаптера и нормализации
status / stageТехническое состояние и текущий этап обработки

📷 Таблица news_media

ПолеТипНазначение
idintPRIMARY KEY AUTO_INCREMENT
news_idvarchar(50)Ссылка на news.id
media_typeenumimage / video / youtube / vimeo
media_urlvarchar(500)URL медиафайла
thumbnail_urlvarchar(500)URL миниатюры
titlevarchar(255)Подпись
descriptiontextОписание медиа
sort_orderintПорядок сортировки
is_maintinyintГлавное изображение (1)
created_attimestampДата создания

🏷️ Таблицы рубрик

rubrics

ПолеНазначение
idPRIMARY KEY AUTO_INCREMENT
nameНазвание рубрики (UNIQUE)
slugURL-алиас (UNIQUE)
descriptionОписание рубрики
parent_idРодительская рубрика (ссылка на rubrics.id)
parent_pathПуть для иерархии (например, "1/5/12")
levelУровень вложенности
sort_orderПорядок сортировки
colorЦвет рубрики
iconЭмодзи-иконка
is_activeАктивность
news_countСчётчик новостей (обновляется триггерами)

news_rubrics

ПолеНазначение
news_idСсылка на news.id
rubric_idСсылка на rubrics.id
sort_orderПорядок рубрик у новости

Примечание: на таблице news_rubrics установлены триггеры для автоматического обновления news_count в рубриках и их родителях.

🎙️ Таблицы подкаста

podcast_queue — очередь новостей для эфира

ПолеНазначение
idPRIMARY KEY AUTO_INCREMENT
news_idСсылка на news.id (внешний ключ ON DELETE CASCADE)
episode_idСсылка на podcast_episodes.id (если назначен выпуск)
group_idСсылка на podcast_groups.id (AI-группировка)
sort_orderПорядок в выпуске
speaker_notesЗаметки для ведущего
statuspending / ready / aired
added_byID пользователя, добавившего в очередь
added_atДата добавления в очередь

podcast_episodes — выпуски подкаста

ПолеНазначение
idPRIMARY KEY AUTO_INCREMENT
titleНазвание выпуска
episode_numberНомер выпуска
air_dateДата эфира
youtube_urlСсылка на YouTube
vk_urlСсылка на VK Видео
statusdraft / published
created_atДата создания

podcast_groups — группы новостей по темам (AI-группировка)

ПолеТипНазначение
idintPRIMARY KEY AUTO_INCREMENT
queue_idintСсылка на podcast_queue.id (первая новость в группе)
topicvarchar(255)Название темы группы
sort_orderintПорядок сортировки групп
created_attimestampДата создания

💬 Комментарии

comments

ПолеНазначение
idPRIMARY KEY AUTO_INCREMENT
news_idСсылка на news.id
parent_idСсылка на родительский комментарий
author_nameИмя автора
author_emailEmail (для Gravatar)
author_websiteСайт автора
contentТекст комментария
is_approved0 — на модерации, 1 — одобрен
ip_addressIP-адрес автора
user_agentUser-Agent автора
created_atДата создания
updated_atДата обновления

comment_likes — лайки комментариев

ПолеНазначение
idPRIMARY KEY AUTO_INCREMENT
comment_idСсылка на comments.id
ip_addressIP-адрес поставившего лайк
created_atДата создания

👥 Административная часть

admin_users

ПолеНазначение
idPRIMARY KEY AUTO_INCREMENT
usernameИмя пользователя (UNIQUE)
password_hashХеш пароля
emailEmail
roleadmin / editor / moderator
full_nameПолное имя
avatarАватар
last_loginПоследний вход
last_ipПоследний IP
is_activeАктивность

admin_logs — действия пользователей

change_history — изменения в сущностях (news, pages, rubrics, users)

admin_sessions — сессии администраторов

📄 Таблица pages

ПолеНазначение
idPRIMARY KEY AUTO_INCREMENT
titleЗаголовок
h1Заголовок H1
slugURL-алиас (UNIQUE)
descriptionОписание (meta-description)
textСодержимое страницы
menu_titleНазвание в меню
activeАктивность
meta_keywordsMeta-ключевые слова
meta_robotsMeta-robots

🗂️ Индексы

-- Основные индексы для производительности
ALTER TABLE news ADD INDEX idx_status (status);
ALTER TABLE news ADD INDEX idx_enrichment_status (enrichment_status);
ALTER TABLE news ADD INDEX idx_date (date);
ALTER TABLE news ADD INDEX idx_importance (importance);
ALTER TABLE news ADD INDEX idx_status_date (status, date);

-- Индексы для рубрик и связей
ALTER TABLE rubrics ADD INDEX idx_parent (parent_id);
ALTER TABLE rubrics ADD INDEX idx_active (is_active);
ALTER TABLE rubrics ADD INDEX idx_sort (sort_order);
ALTER TABLE news_rubrics ADD INDEX idx_news (news_id);
ALTER TABLE news_rubrics ADD INDEX idx_rubric (rubric_id);

-- Индексы для комментариев
ALTER TABLE comments ADD INDEX idx_news (news_id);
ALTER TABLE comments ADD INDEX idx_approved (is_approved);
ALTER TABLE comments ADD INDEX idx_created (created_at);
ALTER TABLE comment_likes ADD UNIQUE INDEX unique_like (comment_id, ip_address);

-- Индексы для подкаста
ALTER TABLE podcast_queue ADD INDEX idx_news (news_id);
ALTER TABLE podcast_queue ADD INDEX idx_episode (episode_id);
ALTER TABLE podcast_queue ADD INDEX idx_group (group_id);
ALTER TABLE podcast_queue ADD INDEX idx_status (status);
ALTER TABLE podcast_groups ADD INDEX idx_queue (queue_id);
ALTER TABLE podcast_episodes ADD INDEX idx_air_date (air_date);

📌 Примечания