Иерархические модели данных: список смежности и вложенные наборы

У меня есть каталог продукции. Каждая категория состоит из разного количества (в глубине) подкатегорий. Количество уровней (глубоких) неизвестно, но я уверен, что оно не будет превышать 5,6 уровней. Изменения данных происходят гораздо реже, чем чтение.

Вопрос в том, какой тип иерархической модели данных больше подходит для такой ситуации. Проект основан на фреймворке Django и его особенности (админка, работа с моделями...) должны быть учтены.

Большое спасибо!


person S2201    schedule 27.05.2009    source источник


Ответы (5)


Nested sets лучше для производительности, если вам не нужны частые обновления или иерархический порядок.

Если вам нужны либо обновления дерева, либо иерархический порядок, лучше использовать модель данных parent-child.

Это легко строится в Oracle и SQL Server 2005+, и не так просто (но все же возможно) в MySQL.

person Quassnoi    schedule 27.05.2009

Я бы использовал модифицированный алгоритм обхода дерева предварительного заказа, MPTT, для такого рода иерархических данных. Это обеспечивает отличную производительность при обходе дерева и поиске дочерних элементов, если вы не возражаете против небольшого штрафа за изменения в структуре.

К счастью, в Django есть отличная библиотека для этого, django-mptt. Я использовал это в ряде проектов с большим успехом. Существует также django-treebeard, который предлагает несколько альтернативных алгоритмов, но я не использовал это (и в любом случае он не кажется таким популярным, как mptt).

person Daniel Roseman    schedule 27.05.2009
comment
Примечание. MPTT и вложенный набор — это разные названия одной и той же концепции. - person jwfearn; 05.11.2010

Согласно этим статьям:

http://explainextended.com/2009/09/24/adjacency-list-vs-nested-sets-postgresql/ http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/

«MySQL — единственная система из большой четверки (MySQL, Oracle, SQL Server, PostgreSQL), для которой модель вложенных множеств показывает достойную производительность и может рассматриваться как хранимая иерархическая информация».

person Enrique    schedule 15.08.2010
comment
Господи... по сравнению с чем? Я обнаружил, что вложенные наборы в значительной степени выбивают двери из конкуренции. Исключение составляют функции CONNECT BY в Oracle. - person Jeff Moden; 11.10.2012

http://www.sqlsummit.com/AdjacencyList.htm

person Jayapal Chandran    schedule 12.07.2010

Список смежности намного проще поддерживать, а запросы к вложенным наборам выполняются намного быстрее.

Проблема всегда заключалась в том, что преобразование списка смежности во вложенные наборы занимало слишком много времени из-за действительно неприятного метода «проталкивания стека», который загружается с помощью RBAR. Таким образом, люди в конечном итоге выполняют действительно сложное обслуживание вложенных наборов или не используют их.

Теперь вы можете получить свой торт и съесть его тоже! Вы можете выполнить преобразование на 100 000 узлов менее чем за 4 секунды и на миллион строк менее чем за минуту! Все на T-SQL, между прочим! Пожалуйста, ознакомьтесь со следующими статьями.

Иерархии на стероидах №1: преобразование списка смежности во вложенные наборы

Иерархии на стероидах №2: замена расчетов с вложенными множествами

person Jeff Moden    schedule 04.03.2013
comment
Большое спасибо за хорошо написанные статьи, молодцы! Мне пришлось преобразовать список смежности в представление вложенного множества в PostgreSQL, и с их помощью я хорошо с этим справился. Ваше здоровье - person VH-NZZ; 28.04.2020
comment
@VH-NZZ - Спасибо за отличный отзыв. Приятно видеть, что этот метод не привязан только к T-SQL. Мне придется изучить PostgreSQL из-за нового аспекта моей работы, и поэтому замечательно знать, что у таких вещей есть путь миграции. - person Jeff Moden; 04.05.2020
comment
Я думаю, вы обнаружите, что PSQL — это совершенно потрясающая система баз данных. Вы определенно можете рассчитывать на добавление этого навыка в свой набор инструментов. - person VH-NZZ; 05.05.2020