Designfrage

Designfrage

am 15.02.2007 11:27:21 von stefan.glaesser

Hallo,

ich habe im Moment 2 Tabellen, die wie folgt aussehen:

catId | parentId | catName
--------------------------
1 | NULL | A1
2 | 1 | A2
3 | 1 | A3
4 | 2 | A4
5 | 2 | A5
6 | 2 | A6
7 | 3 | A7

Das ganze sieht als Baum in etwa so aus:

(A1)
/ \
(A2) (A3)
/ | \ \
(A4) (A5) (A6) (A7)


Jeder dieser Knoten kann beliebig viele Blätter haben. Also Tabelle 2:

productId | catId | productName ....
-------------------------------------
1 | 1 | product 1
2 | 1 | product 2
3 | 5 | product 3
4 | 6 | product 4
5 | 6 | product 5
6 | 6 | product 6
7 | 7 | product 7

So, wie bilde ich es jetzt aber in der Datenbank ab, dass ich alle Produkte
unterhalb eines Knotens angezeigt bekomme?

Bsp: Ich "klicke" Knoten A2 an und möchte in diesem Falle die Produkte
3,4,5,6 angezeigt bekommen.

oder: Ich "klicke" Knoten A3 an und möchte in diesem Falle das Produkt 7
angezeigt bekommen.


Wie bilde ich eine solche Konstruktion in der Datenbank ab? Hilfstabelle?
Das ganze sollte dynamisch wachsen können, die Tiefe das Baumes theoretisch
unbegrenzt.

Weiß jemand, wie man das macht?


Gruß,
Stefan

Re: Designfrage

am 15.02.2007 11:40:40 von Daniel Fischer

Stefan Gläßer!

> catId | parentId | catName
> --------------------------
> 1 | NULL | A1
> 2 | 1 | A2
[...]

> So, wie bilde ich es jetzt aber in der Datenbank ab, dass ich alle
> Produkte unterhalb eines Knotens angezeigt bekomme?

Mit einer einfachen Abfrage wird das nicht hinkommen...

> Wie bilde ich eine solche Konstruktion in der Datenbank ab?
> Hilfstabelle? Das ganze sollte dynamisch wachsen können, die Tiefe das
> Baumes theoretisch unbegrenzt.

Es gibt hier einen Artikel zum Thema:

http://dev.mysql.com/tech-resources/articles/hierarchical-da ta.html

Da steht nicht nur, wie die Abfrage bei deinem Ansatz ungefähr aussieht,
sondern es wird hauptsächlich ein anderer Ansatz (Nested Sets)
beschrieben, der die Auswertung aus Sicht einer Datenbank einfacher macht.
Dort wäre dann die von dir gewünschte Abfrage mit einem SELECT, einem
WHERE, und ein bis zwei AND realisierbar.

Der Artikel ist leider etwas veraltet, d.h. beschreibt insbesondere nicht,
wie man bei einer Struktur wie du sie verwendest mit einer stored
procedure die gewünschte Abfrage realisiert. Das Nested-Sets-Modell ist
trotzdem besser geeignet, ich hoffe es hilft.


Gruß
Daniel