Партиционирование таблицы иерархий (техническая документация)¶
Архитектура решения¶
Партиционирование выполняется только для таблицы 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.
Последовательность шагов:
- Создание временной партиционированной таблицы
core_hierarchy_item_new(LIST поlevel_id). - Создание партиций формата
core_hierarchy_item_new_level_<id>для каждого уровня. - Копирование данных в новую таблицу.
- Проверка целостности (количество строк, отсутствие дубликатов).
- Переключение: старая таблица переименовывается в
_old(или удаляется, еслиkeep_old_tables=False), новая — занимает её место. - Переименование дочерних партиций (убирается суффикс
_new). - Установка триггеров автоматического управления при
install_triggers=True.
disable_partitioning()¶
def disable_partitioning(
self,
keep_partition_backup: bool = False,
) -> None:
Возвращает таблицу core_hierarchy_item к непартиционированному виду.
Последовательность шагов:
- Удаление триггеров автоматического управления.
- Создание временной обычной таблицы
core_hierarchy_item_newс исходной структурой и индексами. - Объединение данных из всех партиций в новую таблицу.
- Проверка целостности (сравнение количества строк).
- Переключение на обычную таблицу с возможным сохранением копии партиционированного варианта (
keep_partition_backup=True).
sync_partitions()¶
Актуализирует набор партиций относительно таблицы уровней.
sync_result = partition_manager.sync_partitions(level: Optional[Level] = None)
- При передаче
levelсоздаёт партицию только для указанного уровня. - Без аргументов создаёт недостающие партиции и удаляет лишние. Возвращает словарь
{"created": n, "dropped": m}.
get_status()¶
Возвращает словарь с диагностикой:
is_partitionedtriggers_installedlevels_countitem_partitions_countmissing_partitionsorphan_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
За уточнениями и методологической поддержкой обращайтесь в компанию
ЮНИК СОФТ