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 (он же родитель-потомок-абсолютный_уровень) - создает ту же самую путаницу.
Кто подскажет, как разруливать?
Очень кратко - речь идет о вложенных элементах, о каталоге с категориями.
Предполагается вот такое дерево:
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 (он же родитель-потомок-абсолютный_уровень) - создает ту же самую путаницу.
Кто подскажет, как разруливать?