Денормализация¶
Денормализация¶
В "Первой Форме" все задачи из всех категорий хранятся в таблице Tasks. При денормализации для категории создается специализированная таблица вида TasksInSubcatXXXXDenormalized, где XXXX — ID категории.
Пример:
- для категории
SubcatID = 111создается таблицаTasksInSubcat111Denormalized.
В этой таблице хранятся:
- базовые поля задачи (ID, статус, сроки и т.д.);
- денормализованные поля категории;
- значения ДП, участвующих в денормализации.
Это позволяет выполнять запросы к категориям заметно быстрее и с меньшим количеством join.
Что денормализуется¶
- Категории (подкатегории) ->
TasksInSubcat*Denormalized. - ДП типа «Таблица» (если включена опция денормализации ДП-таблиц).
- При импорте конфигурации — также сводные разделы (перестроение SQL-view).
Отдельные ДП можно исключить из денормализации:
- в списке ДП включить опцию «Не денормализовывать».
Когда запускать денормализацию¶
Рекомендуется запускать:
- после массовых изменений структуры категории (ДП, параметры текста задачи и т.д.);
- после импорта конфигурации между площадками;
- после переключения версии модуля (в этом сценарии денормализация вызывается автоматически в импортном конвейере).
Как запустить вручную¶
Откройте страницу Денормализация в настройках категории.
Параметры¶
| Параметр | Описание |
|---|---|
| Обновить статистику | Флаг передается в API как часть запроса денормализации. Используется для совместимости с существующим контуром. |
| Обновить существующие данные | Флаг передается в backend-контур денормализации и используется при синхронизации категории. |
| Денормализовать ДП Таблица | При включении дополнительно пересоздаются денормализованные объекты для ДП типа «Таблица». |
| Денормализовать только эту категорию | Запускает денормализацию выбранной категории (POST /api/system/denormalize-subcats). |
| Денормализовать базу полностью | Запускает полную денормализацию (POST /api/system/denormalize-subcats/all). |
ℹ️ Для полной денормализации учитывается список исключений из настройки «Категории исключаемые из полной денормализации» в общих настройках.
После запуска и завершения операция отображается в UI-логах.
Что происходит технически (кратко)¶
- SPA отправляет запрос на
api/system/denormalize-subcatsилиapi/system/denormalize-subcats/all. - Backend запускает
AdminDenormalizer: - для списка категорий — синхронный проход;
- для полной денормализации — асинхронный фоновой run с защитой от параллельного запуска.
- На каждую категорию вызывается сервис синхронизации схемы денормализации (
SyncSchema). - При включенной опции запускается денормализация ДП «Таблица».
- Прогресс транслируется через SignalR
DenormalizationHub(/denormalizationHub, событиеLogMessage). - Старт операции пишется в
ActionLog.
Денормализация в переносе конфигурации¶
При импорте конфигурации опция «Нужна денормализация переносимых категорий» включает post-import денормализацию:
- денормализацию категорий;
- денормализацию сводных разделов;
- обновление кешей после импорта.
Подробный разбор: Утилита переноса (сквозной механизм).
Диагностика¶
Если результат выглядит некорректно, проверяйте по порядку:
- Логи на странице денормализации.
- Наличие записей в
ActionLog. - Состояние денорм-таблицы нужной категории (
TasksInSubcat{SubcatId}Denormalized). - После импорта — также кеши.