Re: Дерево в SQL
От: AleksandrN Россия  
Дата: 30.07.19 11:57
Оценка:
Здравствуйте, 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, но это тоже дублирование информации.
Re: Дерево в SQL
От: Dym On Россия  
Дата: 06.08.19 10:48
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Пока вижу только одно решение — в каждом treeitem иметь treeId как FK на tree. Однако это значит, что у всех узлов этого дерева будет храниться этот treeId, что есть дублирование данных.

PD>Можно ли его избежать ?
А зачем избегать? Надо делать так, чтобы потом было удобно работать.
Счастье — это Glück!
Re[5]: Дерево в SQL
От: wildwind Россия  
Дата: 06.08.19 11:22
Оценка: +2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Предки мне вообще не нужны, потомки нужны в другом месте, с ними я разберусь, а сейчас мне нужно лишь по узлу получить заголовок дерева. Я не думаю, что вариант с просмотром восходящего пути к корню (хоть вручную, хоть средствами сервера, если они есть) является наилучшим решением. Просто в силу того, что нечего устраивать проход там, где можно обойтись без него.


Это классический компромисс между памятью (каждый узел хранит ссылку на дерево) и быстродействием (только корень хранит ссылку на дерево). Каждый разрешает его для себя сам. Либо избыточность данных, либо дополнительные вычисления.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.