2009-02-25 12 views
7

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.

Odpowiedz

4

As MarkusQ i n8wrl już wskazałem, Joe Celko ma kilka dobrych rzeczy na ten temat.Dodam tylko, że istnieje wiele sposobów na modelowanie hierarchii (książka Joe'a zawiera kilka, jak sądzę, nie tylko jedną, którą uważa za "najlepszą"). Twoja ostateczna decyzja, miejmy nadzieję, uwzględni twoje specyficzne potrzeby. Niektóre z różnych sposobów modelowania są lepsze dla operacji wymagających intensywnego zapisu, podczas gdy inne są lepsze dla częstych lub szybkich odczytów w górę iw dół hierarchii. Po prostu pamiętaj, co twój system będzie z tym robił.

10

Istnieje kilka rozszerzeń specyficznych dla dostawcy, aby to zrobić, ale moja ulubiona db-neutralny sposób pochodzi z Joe Čelko - google „Joe Celko Drzewa i hierarchie” lub kupić tej książki: link text

Jest to bardzo mądry oparty na zestawie sposób. Łatwa do hierarchii zapytań. Dodałem pole "parentID", które właśnie masz, ponieważ bardzo często zadaję pytania "bezpośrednie dzieci" i "rodzicielskie" i to przyspiesza. Ale jest to wspaniały sposób na uzyskanie zapytania o "pochodzenie" lub "opisanie".

6

Można również zapoznać się z "zagnieżdżone zestawy" wzór:

http://www.intelligententerprise.com/001020/celko.jhtml (niedziałający link)

można też Google na więcej.

P.S .: Curses, n8wrl, piszesz szybciej niż ja!

+0

zagnieżdżone zestawy! Tego właśnie szukałem! – n8wrl

+0

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. –

+0

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

1

W Oracle można użyć CONNECT BY/START WITH do zapytania danych hierarchicznych. W programie SQL Server można użyć procedury składowanej, która wywołuje się rekursywnie.

+0

Użyłem wywołań rekursywnych, ale zapytanie działa bardzo wolno, dlatego zaimplementowałem tabelę Ancestor, dzięki czemu mogłem uniknąć wywołania rekursywnego. –

Powiązane problemy