Данные иерархии / дерева — Поиск источника

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

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

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

Вот макет моего стола, на котором показаны 2 «семьи», где 1 и 11 — вершина дерева для каждого. В этом примере каждый родитель имеет 2 детей, и каждый номер является внешним ключом для номера контракта клиента.

parents children
1       2
1       3
2       4
2       5
3       6
3       7
11      12
11      13
12      14
12      15
13      16
13      17

До сих пор я использовал MySQL и цикл PHP, чтобы ВЫБРАТЬ родителя, ГДЕ у ребенка есть конкретный номер контракта, а затем посмотреть, не является ли этот родитель сам дочерним в той же таблице. Я продолжаю этот цикл, пока строки не будут возвращены, и я получу ответ.

У меня вопрос, это самый эффективный способ сделать это, или есть решение за пределами PHP, или путем изменения дизайна таблицы? Я вижу, что скоро появятся сотни «поколений», и я не хочу, чтобы это стало слишком медленным.

1

Решение

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

Посмотри на это ответ, это даст вам представление о том, как найти origin любой записи.

1

Другие решения

Билл Карвин сделал хорошее слайд-шоу под названием Антипаттерны SQL наносят ответный удар. Тема обращается к методам обработки деревьев, начиная со слайда 48.

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

0

По вопросам рекламы [email protected]