Создание плоской таблицы / представления иерархически определенного набора данных

У меня есть таблица, содержащая иерархические данные. В настоящее время в этой иерархии ~ 8 уровней.

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

У меня есть PL / SQL хранимые функции, которые делают эти поиски для меня, каждая из которых имеетselect * from tbl start with ... connect by... заявление. Это прекрасно работает, когда я запрашиваю несколько записей, но сейчас я нахожусь в ситуации, когда мне нужно запросить ~ 10 тысяч записей одновременно, и для каждой из них запустить эту функцию. Требуется 2-3 минуты, чтобы запустить его всего за несколько секунд.

Используя некоторую эвристику, основанную на моих знаниях текущих данных, я могу избавиться от функции поиска и просто сделатьchildrecord.key || '%' LIKE parentrecord.key но это действительно грязный хак и не всегда будет работать.

Так что теперь я думаю, что для этой иерархически определенной таблицы мне нужно иметь отдельную таблицу parent-child, которая будет содержать все отношения ... для иерархии, идущей от уровня 1-8, будет 8! записи, связывающие 1 с 2, 1 с 3, ..., 1 с 8 и 2 с 3, 2 с 4, ..., 2 с 8. И так далее.

Я думаю, что мне нужно было бы триггер вставки, где он будет в основном запуститьconnect by запрос и для каждого совпадения, идущего вверх по иерархии, он вставит запись в таблицу поиска. А чтобы справиться со старыми данными, я просто настрою внешние ключи для основной таблицы с каскадным удалением.

Есть ли лучшие варианты, чем этот? Я скучаю по другому способу, которым я мог бы быстрее определить эти отдаленные отношения предка / потомка?

РЕДАКТИРОВАТЬ: Похоже, это именно то, о чем я думаю:http://evolt.org/working_with_hierarchical_data_in_sql_using_ancestor_tables

Ответы на вопрос(1)

Ваш ответ на вопрос