Если ваша единственная задача - выбирать, а не вставлять / обновлять / удалять, это зависит от потребностей, таких как:
- Вам нужно знать, на каком уровне находится каждый узел?
- вам нужно знать, есть ли у каждого узла дочерние элементы при рендеринге?
- вам нужно сортировать братьев и сестер по имени?
Однако, если в самом деле вносятся минимальные изменения в дерево, то почти не имеет значения, какую схему вы используете, поскольку вы можете выполнять всю работу на прикладном уровне и кэшировать вывод.
Изменить:
Когда порядок имеет значение, я обычно использую метод материализованный путь и добавляю дополнительный столбец SortPath. Таким образом, вы можете отсортировать результаты по сиблингу, что является денормализацией, которая делает рендеринг дерева в HTML чрезвычайно простым, поскольку вы можете выписать все дерево (или любую его часть) в том порядке, в каком вы получили записи, используя один запрос. , Это оптимально для скорости и является самым простым способом сортировки более чем одного уровня за раз.
например.,
CREATE TABLE [dbo].[MatPath](
[ID] [int] NULL,
[Name] [varchar](50) NULL,
[Path] [varchar](max) NULL,
[SortPath] [varchar](max) NULL
)
insert into MatPath (ID, Name, Path, SortPath) values (1, 'Animal', '1', 'Animal-1')
insert into MatPath (ID, Name, Path, SortPath) values (2, 'Dog', '1.2', 'Animal-1|Dog-2')
insert into MatPath (ID, Name, Path, SortPath) values (3, 'Horse', '1.3', 'Animal-1|Horse-3')
insert into MatPath (ID, Name, Path, SortPath) values (4, 'Beagle', '1.2.4', 'Animal-1|Dog-2|Beagle-4')
insert into MatPath (ID, Name, Path, SortPath) values (5, 'Abyssinian', '1.3.5', 'Animal-1|Horse-3|Abyssinian-5')
insert into MatPath (ID, Name, Path, SortPath) values (6, 'Collie', '1.2.6', 'Animal-1|Dog-2|Collie-6')
select *
from MatPath
order by SortPath
Выход:
ID Name Path SortPath
------ --------------- ----------- --------------------------------
1 Animal 1 Animal-1
2 Dog 1.2 Animal-1|Dog-2
4 Beagle 1.2.4 Animal-1|Dog-2|Beagle-4
6 Collie 1.2.6 Animal-1|Dog-2|Collie-6
3 Horse 1.3 Animal-1|Horse-3
5 Abyssinian 1.3.5 Animal-1|Horse-3|Abyssinian-5
(6 row(s) affected)
Вы можете определить уровень каждого узла путем подсчета каналов (или периодов) на прикладном уровне или в SQL, используя любые встроенные или пользовательские функции, которые могут подсчитывать вхождения строки .
Кроме того, вы заметите, что я добавляю ID
к Name
при сборке SortPath
. Это необходимо для того, чтобы два дочерних узла с одинаковым именем всегда возвращались в одном и том же порядке.