news| Поле | Тип | Назначение |
|---|---|---|
id | int | PRIMARY KEY AUTO_INCREMENT |
title | varchar(255) | Заголовок новости |
seo_title | varchar(255) | SEO-заголовок |
status | enum | draft / published / archived |
date | timestamp | Дата новости (публикации) |
source_name | varchar(255) | Название источника |
content | longtext | Основной текст новости |
description | varchar(500) | Короткое описание (тизер для ленты и meta-description) — ✅ реализовано |
created_at | timestamp | Дата создания |
updated_at | timestamp | Дата обновления |
context | longtext | Предыстория, причины события |
timeline | longtext | Хронология событий (JSON массив) |
development | longtext | Развитие ситуации после публикации |
expert_comment | longtext | Комментарий редакции |
speaker_notes | longtext | Пометки для ведущего (не публикуются) |
ai_suggestions | longtext | Варианты подачи от AI (JSON) |
ai_log | longtext | JSON-лог всех AI-действий (предложения, поиски, обновления) |
status | varchar | Редакционный статус: draft / published / archived |
enrichment_status | varchar | Статус обогащения: pending / processing / completed / failed / skipped |
enriched_at | datetime | Дата последнего успешного обогащения |
enrichment_version | varchar(100) | Версия обработчика обогащения |
enrichment_error | text | Последняя ошибка обогащения |
source_urls | longtext | Дополнительные источники (JSON) |
importance | tinyint | Важность (0–10), финальное значение |
sentiment | enum | positive / negative / neutral / mixed; ИИ-обогащением не изменяется |
selected_presentation | varchar(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| Поле | Тип | Назначение |
|---|---|---|
id | int | PRIMARY KEY AUTO_INCREMENT |
news_id | varchar(50) | Ссылка на news.id |
media_type | enum | image / video / youtube / vimeo |
media_url | varchar(500) | URL медиафайла |
thumbnail_url | varchar(500) | URL миниатюры |
title | varchar(255) | Подпись |
description | text | Описание медиа |
sort_order | int | Порядок сортировки |
is_main | tinyint | Главное изображение (1) |
created_at | timestamp | Дата создания |
rubrics| Поле | Назначение |
|---|---|
id | PRIMARY KEY AUTO_INCREMENT |
name | Название рубрики (UNIQUE) |
slug | URL-алиас (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 — очередь новостей для эфира| Поле | Назначение |
|---|---|
id | PRIMARY 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 | Заметки для ведущего |
status | pending / ready / aired |
added_by | ID пользователя, добавившего в очередь |
added_at | Дата добавления в очередь |
podcast_episodes — выпуски подкаста| Поле | Назначение |
|---|---|
id | PRIMARY KEY AUTO_INCREMENT |
title | Название выпуска |
episode_number | Номер выпуска |
air_date | Дата эфира |
youtube_url | Ссылка на YouTube |
vk_url | Ссылка на VK Видео |
status | draft / published |
created_at | Дата создания |
podcast_groups — группы новостей по темам (AI-группировка)| Поле | Тип | Назначение |
|---|---|---|
id | int | PRIMARY KEY AUTO_INCREMENT |
queue_id | int | Ссылка на podcast_queue.id (первая новость в группе) |
topic | varchar(255) | Название темы группы |
sort_order | int | Порядок сортировки групп |
created_at | timestamp | Дата создания |
comments| Поле | Назначение |
|---|---|
id | PRIMARY KEY AUTO_INCREMENT |
news_id | Ссылка на news.id |
parent_id | Ссылка на родительский комментарий |
author_name | Имя автора |
author_email | Email (для Gravatar) |
author_website | Сайт автора |
content | Текст комментария |
is_approved | 0 — на модерации, 1 — одобрен |
ip_address | IP-адрес автора |
user_agent | User-Agent автора |
created_at | Дата создания |
updated_at | Дата обновления |
comment_likes — лайки комментариев| Поле | Назначение |
|---|---|
id | PRIMARY KEY AUTO_INCREMENT |
comment_id | Ссылка на comments.id |
ip_address | IP-адрес поставившего лайк |
created_at | Дата создания |
admin_users| Поле | Назначение |
|---|---|
id | PRIMARY KEY AUTO_INCREMENT |
username | Имя пользователя (UNIQUE) |
password_hash | Хеш пароля |
email | |
role | admin / editor / moderator |
full_name | Полное имя |
avatar | Аватар |
last_login | Последний вход |
last_ip | Последний IP |
is_active | Активность |
admin_logs — действия пользователейchange_history — изменения в сущностях (news, pages, rubrics, users)admin_sessions — сессии администраторовpages| Поле | Назначение |
|---|---|
id | PRIMARY KEY AUTO_INCREMENT |
title | Заголовок |
h1 | Заголовок H1 |
slug | URL-алиас (UNIQUE) |
description | Описание (meta-description) |
text | Содержимое страницы |
menu_title | Название в меню |
active | Активность |
meta_keywords | Meta-ключевые слова |
meta_robots | Meta-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);
description — реализовано. Используется для тизера в ленте новостей и meta-description.ai_log — реализовано. Хранит JSON-лог всех AI-действий.news_rubrics установлены триггеры для автоматического обновления news_count в рубриках и их родителях.podcast_queue.news_id ссылается на news.id с каскадным удалением.podcast_groups — создана для AI-группировки новостей по темам. Поле queue_id ссылается на первую новость в группе.group_id в podcast_queue — связывает новость с группой для AI-группировки.