Jestem ciekawy, jaki jest najlepszy sposób (najlepsza praktyka) obsługi hierarchii w odniesieniu do projektowania bazy danych. Oto mały przykład tego, jak zwykle sobie z nimi radzę.Dane hierarchii przenoszenia w bazie danych
Tabela Węzeł
NodeId int PRIMARY KEY
NodeParentId int NULL
DisplaySeq int NOT NULL
Title nvarchar(255)
przodek Tabela
NodeId int
AncestorId int
Hops int
z indeksami nodeid, AncestorId, chmiel
Tabele wyglądać następująco:
Węzeł Tabela
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'
Przodek Tabela
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
Z tym wzorem, znalazłem, że przy dużych hierarchii mogę dostać całą sekcję hierarchii bardzo szybko poprzez łączenie na Tabela przodków dla AncestorId = target NodeId, na przykład:
SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
To także e asy, aby uzyskać bezpośrednie dzieci, jak również
SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
AND Hops = 1
Jestem zainteresowany poznaniem innych rozwiązań, które można użyć do tego typu rzeczy. Z mojego doświadczenia wynika, że hierarchie mogą być dość owłosione, a jakikolwiek sposób optymalizacji ich pobierania jest bardzo ważny.
zagnieżdżone zestawy! Tego właśnie szukałem! – n8wrl
Bardzo interesujący artykuł. Jedyny problem, jaki zawsze miałem, to dodawanie/usuwanie węzła, po którym trzeba aktualizować położenie każdego innego węzła. –
Ty to robisz. I właśnie w tym miejscu odpowiedź Toma H jest tak ważna. Dla mnie działa to wspaniale w hierarchii. Nieczęsto się zmieniam. – n8wrl