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

Партиционирование таблицы иерархий (техническая документация)

Архитектура решения

Партиционирование выполняется только для таблицы core_hierarchy_item по ключу level_id. Таблица core_hierarchy_item_parents остаётся обычной и использует стандартные индексы.

Основные компоненты:

  • /src/planiqum/core/hierarchy/libs/partitioning.py: ItemPartitionManager — единая точка управления процессом
  • Management-команды из пакета planiqum.core.hierarchy.management.commands (partitioning_enable, partitioning_disable, partitioning_sync, partitioning_status)
  • PostgreSQL-триггеры для таблицы уровней core_hierarchy_level, которые автоматически создают и удаляют партиции
  • Тесты в файле /src/planiqum/core/hierarchy/tests/test_partitioning.py

ItemPartitionManager

enable_partitioning()

def enable_partitioning(
    self,
    install_triggers: bool = True,
    keep_old_tables: bool = True,
) -> None:

Выполняет переход на партиционированную структуру для core_hierarchy_item.

Последовательность шагов:

  1. Создание временной партиционированной таблицы core_hierarchy_item_new (LIST по level_id).
  2. Создание партиций формата core_hierarchy_item_new_level_<id> для каждого уровня.
  3. Копирование данных в новую таблицу.
  4. Проверка целостности (количество строк, отсутствие дубликатов).
  5. Переключение: старая таблица переименовывается в _old (или удаляется, если keep_old_tables=False), новая — занимает её место.
  6. Переименование дочерних партиций (убирается суффикс _new).
  7. Установка триггеров автоматического управления при install_triggers=True.

disable_partitioning()

def disable_partitioning(
    self,
    keep_partition_backup: bool = False,
) -> None:

Возвращает таблицу core_hierarchy_item к непартиционированному виду.

Последовательность шагов:

  1. Удаление триггеров автоматического управления.
  2. Создание временной обычной таблицы core_hierarchy_item_new с исходной структурой и индексами.
  3. Объединение данных из всех партиций в новую таблицу.
  4. Проверка целостности (сравнение количества строк).
  5. Переключение на обычную таблицу с возможным сохранением копии партиционированного варианта (keep_partition_backup=True).

sync_partitions()

Актуализирует набор партиций относительно таблицы уровней.

sync_result = partition_manager.sync_partitions(level: Optional[Level] = None)
  • При передаче level создаёт партицию только для указанного уровня.
  • Без аргументов создаёт недостающие партиции и удаляет лишние. Возвращает словарь {"created": n, "dropped": m}.

get_status()

Возвращает словарь с диагностикой:

  • is_partitioned
  • triggers_installed
  • levels_count
  • item_partitions_count
  • missing_partitions
  • orphan_partitions
  • При verbose=True добавляется partition_details (размер и количество строк по каждой партиции).

Триггеры PostgreSQL

Устанавливаются функцией _install_auto_partition_triggers():

  • auto_create_item_partitions() — создаёт партицию core_hierarchy_item_level_<id> при добавлении уровня.
  • auto_drop_item_partitions() — удаляет соответствующую партицию при удалении уровня.

Триггеры регистрируются на core_hierarchy_level (AFTER INSERT, BEFORE DELETE). При отключении партиционирования функции и триггеры удаляются.

Management-команды

Команда Назначение Ключевые опции
python manage.py partitioning_enable Включить партиционирование --force, --no-triggers, --drop-old
python manage.py partitioning_disable Отключить партиционирование --keep-partition-backup, --cleanup-old-tables, --force
python manage.py partitioning_sync Создать/удалить партиции --level-id, --drop-orphans, --force
python manage.py partitioning_status Показать статус --verbose

Все команды используют ItemPartitionManager и выводят детальные логи через стандартный логгер проекта.

Тестирование

Юнит-тесты для текущего механизма находятся в /src/planiqum/core/hierarchy/tests/test_partitioning.py и покрывают:

  • успешное включение и отключение партиционирования;
  • автоматическое создание партиции для нового уровня через sync_partitions();
  • корректное формирование статуса (get_status);
  • интеграционное поведение management-команд partitioning_enable и partitioning_status (через call_command).

Перед запуском тестов фикстуры в tests/conftest.py создают тип и базовые уровни, а также гарантируют, что партиционирование изначально отключено.

Запуск набора:

pytest src/planiqum/core/hierarchy/tests/test_partitioning.py -v

Командные тесты автоматически возвращают таблицу в непартиционированное состояние, поэтому дополнительных действий по очистке не требуется.

Эксплуатационные заметки

  • Партиционирование касается только core_hierarchy_item, поэтому вставки в core_hierarchy_item_parents не требуют дополнительных полей.
  • При пакетной загрузке данных рекомендуется предварительно выполнить partitioning_sync, чтобы партиции для всех уровней существовали заранее.
  • Для отката к непартиционированной схеме достаточно запустить partitioning_disable без дополнительных параметров.

Важно: описанные настройки и сценарии могут отличаться в вашей инсталляции Planiqum
За уточнениями и методологической поддержкой обращайтесь в компанию ЮНИК СОФТ