Closure Table и обычный такой каталог

G

gzhegow

* Пусть вас не пугает слово Closure Table, оно в названии только чтобы знали куда я гуглил.

Очень кратко - речь идет о вложенных элементах, о каталоге с категориями.
Предполагается вот такое дерево:

0
1 2
2 3
4

Всего две веточки, начинающиеся из нуля.

Прошу обратить внимание на повторяющийся элемент 2 в обоих ветках. Это не ошибка, в этом основная суть вопроса - что при попытке вывести дерево по родителям - у двойки будет два потомка в обоих случаях, а нужно чтобы в первом был один и во втором один.

Метод Closure Table предлагает хранить это дерево вот в таком виде:
ancestor | descedant | relative_level
0 0 0
1 1 0
2 2 0
4 4 0
2 2 0
3 3 0
0 1 1
0 2 2
0 4 3
0 2 1
0 3 2
1 2 1
1 4 2
2 4 1
2 3 1

Ниже я подсвечу дубли, которые появляются в результате такой записи. А дубли значит что? Правильно, при попытке выбрать код выберет либо обе ветки, либо ни одной, либо одну, заведомо неизвестно какую, а нам-то понадобится КОНКРЕТНАЯ!

0 0 0
1 1 0
2 2 0 (дубль 1)
4 4 0
2 2 0 (дубль 1)
3 3 0
0 1 1
0 2 2 (дубль 2 с разным уровнем)
0 4 3
0 2 1 (дубль 2 с разным уровнем)
0 3 2
1 2 1
1 4 2
2 4 1
2 3 1

Даже если абсолютные дубли можно дважды не добавлять, то дубли с разным уровнем все равно создадут путаницу. У кого-то есть мысли как это реализуется лучше?

Nested Sets (они же отступы счетчики слева-справа поочередным обходом дерева снаружи против часовой стрелки) - сложны в обслуживании и едвали решают эту задачу, как создают 10 новых

Adjacency List (он же родитель-потомок-абсолютный_уровень) - создает ту же самую путаницу.

Кто подскажет, как разруливать?
 
А

Андерс

Есть в SQL одна замечательная штука. Называется "индексы".
 
Мы в соцсетях: