Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Пока вижу только одно решение — в каждом treeitem иметь treeId как FK на tree. Однако это значит, что у всех узлов этого дерева будет храниться этот treeId, что есть дублирование данных. PD>Можно ли его избежать ?
Можно использовать первичный ключ из двух колонок — treeId, nodeId, например:
1,1
1,2
1,3
2,1
2,2
Либо часть разрядов в ID ключа использовать как ID дерева. Например, пусть PK имеет тип int(5), первые 2 разряда будет ID дерева, остальные — ID узла в дереве, т.е.:01
01001
01002
01003
02001
02002
Подобный подход я видел в БД КЛАДР.
Но такие подходы имеют минусы — вместо sequence придётся изобретать свой велосипед, работающий при множественных подключениях к БД, а это сильно усложнит логику твоей системы, увеличит сроки разработки и усложнит поддержку.
Поэтому, думаю, что бы узнать вершину дереву по его листу, лучше будет либо идти по дереву до вершины, либо хранить ID дерева в записи узла. Выбрать приоритет — скорость или отсутствие дублирования информации. Можно хранить вершину дерева не в узле, а в отдельной таблице с колонками treeID, nodeID, но это тоже дублирование информации.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Пока вижу только одно решение — в каждом treeitem иметь treeId как FK на tree. Однако это значит, что у всех узлов этого дерева будет храниться этот treeId, что есть дублирование данных. PD>Можно ли его избежать ?
А зачем избегать? Надо делать так, чтобы потом было удобно работать.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Предки мне вообще не нужны, потомки нужны в другом месте, с ними я разберусь, а сейчас мне нужно лишь по узлу получить заголовок дерева. Я не думаю, что вариант с просмотром восходящего пути к корню (хоть вручную, хоть средствами сервера, если они есть) является наилучшим решением. Просто в силу того, что нечего устраивать проход там, где можно обойтись без него.
Это классический компромисс между памятью (каждый узел хранит ссылку на дерево) и быстродействием (только корень хранит ссылку на дерево). Каждый разрешает его для себя сам. Либо избыточность данных, либо дополнительные вычисления.