2009-03-29 4 views
8

Что такое «лучшие практики» для сохранения композитных паттернов в реляционной базе данных?Хранение композитных шаблонов (иерархических данных) в базе данных

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

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

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

+0

IR действительно немного зависит от типа запросов. –

ответ

6

При поиске всех потомков строки с MPTT быстро, поиск всех детей может быть медленным. Однако вы можете исправить это, добавив в таблицу parent_id в таблицу, которая записывает (да, избыточно) родительский элемент строки. Тогда поиск становится:

SELECT * 
FROM tbl 
WHERE parent_id = z 

Да, parent_id содержит избыточную информацию, потенциально денормализации таблицу - но так как любая вставка/обновление/удаление уже требует глобальных изменений, сохраняя parent_id уточненный не много дополнительных платить. Вы также можете использовать поле level, которое записывает вертикальный уровень строки, хотя это фактически больше может измениться при определенных типах преобразований (например, перемещение поддерева в другую точку в дереве).

Равнина старого представления ссылка к родителю (т.е. просто иметь parent_id и не left_pos или right_pos), это, конечно, быстрее для вставки/обновления тяжелых нагрузок, но только запросы, которые она может ответить эффективно являются «Найти родитель X "и" Найдите детей X ". Большинство рабочих нагрузок требуют гораздо больше чтения, чем написания, поэтому обычно MPTT работает быстрее, но, возможно, в вашем случае вам нужно переместить («назад») в ссылку на родителя?

0

Лучший способ хранения иерактериальных данных в базе данных, которую я слышал, заключается в использовании строкового атрибута, где содержание - это список родителей, разделенных, например, colons.

Смежные вопросы