Перейти к содержанию

Денормализация

Денормализация

В "Первой Форме" все задачи из всех категорий хранятся в таблице Tasks. При денормализации для категории создается специализированная таблица вида TasksInSubcatXXXXDenormalized, где XXXX — ID категории.

Пример:

  • для категории SubcatID = 111 создается таблица TasksInSubcat111Denormalized.

В этой таблице хранятся:

  • базовые поля задачи (ID, статус, сроки и т.д.);
  • денормализованные поля категории;
  • значения ДП, участвующих в денормализации.

Это позволяет выполнять запросы к категориям заметно быстрее и с меньшим количеством join.

Что денормализуется

  1. Категории (подкатегории) -> TasksInSubcat*Denormalized.
  2. ДП типа «Таблица» (если включена опция денормализации ДП-таблиц).
  3. При импорте конфигурации — также сводные разделы (перестроение SQL-view).

Отдельные ДП можно исключить из денормализации:

  • в списке ДП включить опцию «Не денормализовывать».

Когда запускать денормализацию

Рекомендуется запускать:

  • после массовых изменений структуры категории (ДП, параметры текста задачи и т.д.);
  • после импорта конфигурации между площадками;
  • после переключения версии модуля (в этом сценарии денормализация вызывается автоматически в импортном конвейере).

Как запустить вручную

Откройте страницу Денормализация в настройках категории.

Параметры

Параметр Описание
Обновить статистику Флаг передается в API как часть запроса денормализации. Используется для совместимости с существующим контуром.
Обновить существующие данные Флаг передается в backend-контур денормализации и используется при синхронизации категории.
Денормализовать ДП Таблица При включении дополнительно пересоздаются денормализованные объекты для ДП типа «Таблица».
Денормализовать только эту категорию Запускает денормализацию выбранной категории (POST /api/system/denormalize-subcats).
Денормализовать базу полностью Запускает полную денормализацию (POST /api/system/denormalize-subcats/all).

ℹ️ Для полной денормализации учитывается список исключений из настройки «Категории исключаемые из полной денормализации» в общих настройках.

После запуска и завершения операция отображается в UI-логах.

Что происходит технически (кратко)

  1. SPA отправляет запрос на api/system/denormalize-subcats или api/system/denormalize-subcats/all.
  2. Backend запускает AdminDenormalizer:
  3. для списка категорий — синхронный проход;
  4. для полной денормализации — асинхронный фоновой run с защитой от параллельного запуска.
  5. На каждую категорию вызывается сервис синхронизации схемы денормализации (SyncSchema).
  6. При включенной опции запускается денормализация ДП «Таблица».
  7. Прогресс транслируется через SignalR DenormalizationHub (/denormalizationHub, событие LogMessage).
  8. Старт операции пишется в ActionLog.

Денормализация в переносе конфигурации

При импорте конфигурации опция «Нужна денормализация переносимых категорий» включает post-import денормализацию:

  • денормализацию категорий;
  • денормализацию сводных разделов;
  • обновление кешей после импорта.

Подробный разбор: Утилита переноса (сквозной механизм).

Диагностика

Если результат выглядит некорректно, проверяйте по порядку:

  1. Логи на странице денормализации.
  2. Наличие записей в ActionLog.
  3. Состояние денорм-таблицы нужной категории (TasksInSubcat{SubcatId}Denormalized).
  4. После импорта — также кеши.

Связанные материалы