Мне любопытно узнать, каков наилучший способ (лучшая практика) для работы с иерархиями в отношении проектирования баз данных. Вот небольшой пример того, как я обычно обращаюсь с ними.
Таблица узлов
NodeId int PRIMARY KEY
NodeParentId int NULL
DisplaySeq int NOT NULL
Title nvarchar(255)
Таблица предков
NodeId int
AncestorId int
Hops int
с индексами на NodeId, AncestorId, Hops
Таблицы выглядят так:
Таблица узлов
NodeId NodeParentId DisplaySeq Title
1 NULL 1 'Root'
2 1 1 'Child 1'
3 1 2 'Child 2'
4 2 1 'Grandchild 1'
5 2 2 'Grandchild 2'
Таблица предков
NodeId AncestorId Hops
1 NULL 0
1 1 0
2 1 1
2 2 0
3 1 1
3 3 0
4 1 2
4 2 1
4 4 0
5 1 2
5 2 1
5 5 0
С этим дизайном я обнаружил, что с большими иерархиями я могу очень быстро получить весь раздел иерархии, подключившись к таблице Ancestor для AncestorId = target NodeId, например:
SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
Также легко получить прямых детей
SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
AND Hops = 1
Мне интересно знать, какие другие решения вы могли бы использовать для такого типа вещей. По моему опыту, иерархии могут стать довольно волосатыми, и любой способ оптимизации их поиска очень важен.