# hierarchische warengruppen



## JanDelay (19. Mai 2003)

hallo

ich hätte da gerne mal ein paar tips von euch...

da ich im datenbank design noch nich so der held bin hätte ich gern ma ein bisschen hilfe...

ich habe folgendes problem...
entweder denke ich zu kompliziert oder es ist kompliziert

ich möchte für meinen onlineshop hierarchiche warengruppen benutzen...die von den benutzern wie im dateisystem z.b. verändert und mit artikeln gefüllt werden können...

bsp. 

**EDIT** mist...die einrückung funzt leider nicht...

Aufkleber
    |
     -- Flaggen
     -- Tiere
          |
           -- Hunde
                 |
                  Bulldoggen
                  Yorkshire
                  usw.
           -- Katzen
           -- usw.
     -- Tribals
     -- usw.
Mousepads
    |
     -- Vorlagen
     -- Spezifisch
Tassen
usw. usw.

jetzt erst ma der weg den ich mir gedacht habe:

ich nehme mal an ich brauche eine tabelle "warengruppen"
die beinhaltet dann 

Aufkleber, Mousepads, Tassen

da hab ich drin id, warengruppename

dann brauche ich ne tabelle "untergruppen"
die hat dann Flaggen Tiere Tribals Vorlagen Spezifisch

mit feldern id, untergruppenname, warengruppen_id

so...bis hier hin is es ja relativ einfach....aber die dritte
stufe bereitet mir sorgen...in dem fall dann die untergruppen von "Hunde".

wo kommt die dann rein...und wie frag ich das dann ab....

btw. sollen die warengruppen dann über ein menü adminstrierbar sein...so das das hinzufügen von tabellen usw dynamisch passieren muss


ich hoffe mir kann jemand helfen...

mfg

JanDelay


----------



## tefla (19. Mai 2003)

mach einfach 3tabellen

einns hauptkategorien
unterkategorien
und produkte

und die alle mit id's quer verknüpfen.

sollte nicht so schwer sein.

ansonsten es gibt jede menge gute ratschläge, wie man db's am besten anlegt, einfach mal googlen.

servus,

hab nu feierabend


----------



## JanDelay (19. Mai 2003)

hallo

danke für die antwort

und das funzt auch wenn es tiefer als unter eine hauptkategorie geht?

also ne untergruppe vonner untergruppe??

kann mir das so schlecht bildlich vorstellen...habs shon mit ER-modell verscuht.....aber das kann man bei mir eh vergessen ^^

hab in der school nich genug aufgepasst bei database design...gg

mfg

Jan


----------



## melmager (19. Mai 2003)

Wenn die Anzahl der Gruppen/Untergruppen
konstant (immer gleich) sind erstellt man am besten für jede Gruppe ne Tabelle

Lustig wird es erst wenn Die Anzahl variabel ist 

sprich
Warengruppe A = Untergruppe = Unteruntergruppe = Artikel
und auch den
Warengruppe B = Untergruppe = Artikel


----------



## JanDelay (19. Mai 2003)

@melmager

genau das is das problem...

deswegen poste ich ja hier weil ich echt mit meinem newbie wissen über db design keine ahnung habe wie ich das anstellen soll

will das shopsystem für mich und 2 kunden einsetzen und deshalb eigentlich von grund auf alles richtig machen...und das mit den warengruppen is das einzige problem wo ich echt nich mehr weiterweiss....

kennt jemand nen os shop wo ich mir evtl. ma die vorgehensweise "klauen" kann ^^

mfg

JanDelay


----------



## derGugi (20. Mai 2003)

und wenn du einfach eine Tabelle erstellst mit den Feldern: 

Gruppe    |  Stufe  |  Ober-Gruppe
----------------------------------
Tiere     |    1    |     alle
alle      |    0    |      -
Pasta     |    2    |    Essen
Haustiere |    2    |    Tiere
Essen     |    1    |     alle

keine Ahnung, ob das ne gute Idee ist, hab sowas noch nie ausprobiert.


----------



## melmager (20. Mai 2003)

du kucken da 

http://www.tutorials.de/tutorials27144.html


dat kann man zum shop ausbauen 
(bin ich auch grade bei  )


----------



## JanDelay (20. Mai 2003)

hmm...sieht gut aus

werde ich heude abend gleich ma probieren....

thx alot

mfg

JanDelay


----------



## dave_ (20. Mai 2003)

wenns kein limit an leveln geben soll:
http://www.tutorials.de/tutorials77686.html

versuchs doch mal, ich denke on onlineshop währe ideal für das modell, da man bei einem online shop nicht so oft etwas einträgt, aber ganz viel ausliest.


----------



## bn (20. Mai 2003)

für unlimitierte hirarchie benötigst du das nested sets modell...es ist sehr komplex zu programmieren aber man kann unendlich kategorien und dazu auch files anlegen.

ich habe so etwas mal für ein downloadscript programmiert, welches allerdings aufgrund von zeitmangel nie zu ende programmiert wurde.

kannst es dir ja mal ansehen  :
http://www.php-progger.de/vietcong/downloadscript/?inc=admin

cu bloddy


----------



## melmager (20. Mai 2003)

Was mir noch fehlt für die nested set Modell fehlt, ist die abfrage für eine quer abfrage

mal mal weiter drüber nachdenken und wenn ich ne idee dazu habe werde ich mal ein tut dazu loslassen 

sprich nicht nur ne auflistung vom ast zum root sondern auch Äste die auf gleicher Ebene liegen

eine ne Idee?


----------



## bn (20. Mai 2003)

verstehe nicht ganz was du meinst.  
jedoch hab ich mich dermaßen mit dem kram beschäftigt, das ich keine probs mehr mit habe.
vielleicht finden wir ja eine lösung für dein problem.

greetz bloddy


----------



## JanDelay (20. Mai 2003)

@bloody

wen du so plan von dem modell hast dann versuch doch mal mit kurzen worten zu erklären was mich da erwartet

habe das o.g. beispiel von melmager ma angeguckt und schon zu 60 % in meinen shop reingebastelt...für meine verhältnisse denk ich mal reicht das erst mal...

nur wenn es für so etwas extra modelle gibt dann werd ich mir das doch gerne mal geben

mfg

JanDelay


----------



## bn (21. Mai 2003)

ich habe mir das tutorial "Status Quo" solange reingezogen, bis ich es endlich kapiert habe.

hier gehts zum tutorial

im prinzip sieht die tabelle für die ordnerstruktur in etwa so aus:

```
CREATE TABLE baumtab (
  baum_id int(10) unsigned NOT NULL auto_increment,
  root_id int(10) unsigned NOT NULL default '0',
  baum varchar(64) default NULL,
  beschreibung varchar(250) NOT NULL default '',
  lft int(10) unsigned NOT NULL default '0',
  rgt int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (baum_id),
  KEY root_id (root_id)
) TYPE=MyISAM;
```

Erklärung:
baum_id ist eine eindeutige ID eines jeden Ordners bzw. Subordners und man kann darüber einen einzelnen Ordner ansprechen.

root_id ist eine Art Zugehörigkeit zu der Wurzel eines jeweiligen Baumes und wird neuen Wurzeln fortlaufend erteilt. Am besten kann diese ID anhand eines Baumstrukturforums erklären. 
Bsp.:
Es existieren 2 Threads:
1, <-- root_id = 1; baum_id = 1
2  <-- root_id = 2; baum_id = 2
zu diesen Threads existieren jeweils 2 Antworten:
1_1, 1_2, <-- root_id = 1; baum_id = 3
2_1, 2_2  <-- root_id = 2; baum_id = 4
zu diesen Antworten existiert jeweils eine Antwort:
1_1_1, 1_2_1 <-- root_id = 1; baum_id = 5
2_1_1, 2_2_1 <-- root_id = 2; baum_id = 6

Bis hierhin ist alles noch ganz einfach und auch nachvollziehbar. Die Schwierigkeit kommt erst bei lft und rgt.
Folgende Grafik erläutert die felder lft und rgt sehr gut:





Für uns sind lediglich die beiden Ziffern im unteren Bereich eines jeden Kästechens interessant, wobei dieses Bild nur einen einzigen mit sehr vielen Verschachtelungen Forenthread abbildet.
Ich kann es den Sachverhalt schlecht in Worte fassen, aber ich denke nach einer ausführlichen Betrachtung versteht man, was die beiden Ziffern bewirken. Die linke ist steht jeweils für lft und die rechte für rgt.

Du mußt dir die Queries auch nicht aus den Fingern saugen - das haben andere schon erledigt, so das du einfach darauf zurückgreifen kannst:
http://ffm.junetz.de/members/reeg/DSP/node10.html#SECTION04344000000000000000

cu bloddy


----------



## melmager (21. Mai 2003)

@bloddy newbie

ok ich versuche es mal zu erklären. Da ich das ganze auch mit einem Menü kombinieren möchte, muss es möglich sein nicht nur Nachfolger und
Väter rauszusuchen sondern auch Einträge die auf der gleichen Ebene liegen. Ich denke das geht nur mit einem dritten feld in der db

root 1 25
 a 2 5
  aa 3 4
 b 6 11
  ba 7 10
  bb 8 9

das ist mal ne kurzform und die frage ist wie bekomme ich a und b allein ohne die unterpunkte aa,ba,bb

edit: mal dein bild nimm 
wie komme ich an die ausgabe von a , b , c 

wenn du das bild um 90 Grad nach links kipps haste ja da menu was ich brauche. wenn du dann menutechnich auf b bist muss ja auch b1 und b2 
angezeigt werden zusätzlich zu den a,b und c

ausgabe
a
b
c

dann gehste auf b dann kommt die ausgabe
a
b
b1
b2
c


----------



## bn (21. Mai 2003)

```
SELECT node1.baum, node1.baum_id, COUNT(*) AS level FROM baumtab AS node1, baumtab AS node2 WHERE node1.lft BETWEEN node2.lft AND node2.rgt GROUP BY node1.LFT
```

level ist in diesem fall die ebene (von 1 bis knipps).
bei dir sehen die levels dann so aus:
baum | lft | rgt | level
------------------------
root 1 25 <-- Level 1
a 2 5 <-- Level 2
aa 3 4 <-- Level 3
b 6 11<-- Level 2
ba 7 10 <-- Level 3
bb 8 9 <-- Level 3

Nun die Level zu filtern, sollte kein problem darstellen .

Greetz Bloddy

edit:

ich würde an deiner stelle das menü anders aufbauen - also nicht nur eine root sondern zu jedem Überpunkt eine neue root...so kannst du viel einfach selektieren, da du ja die root_id bei jedem Überpunkt um eins erhöhst...mit sicherheit kommt das auch der ausführungsgeschwindigkeit des queries zu gute ^^.
wenn du diesbezüglich noch fragen hast, kann ich dir gerne noch mehr code geben, denn ich habe es auch mit mehreren root_id programmiert.

cya


----------



## melmager (21. Mai 2003)

@bloddy newbie

dann sind wir uns ja einig 
man braucht noch ein feld . Ich habe mir schon ein Paar Stunden den Kopf gemartert aber ohne das dritte feld gehts nicht.


Edit: Trotzdem noch ein wenig grübeln geh
Denn die frage ist: Verwalte ich drei steuerungsfelder in der DB
oder
lasse ich meine Version wie sie ist


----------



## bn (21. Mai 2003)

ne kein 3. feld...level ist nur virtuell und entsteht durch count(*) AS level.

die felder reichen schon


----------



## melmager (21. Mai 2003)

nee ich denke nicht wenn du auf level drei bist
 und ba anzeigst
darf nicht aa mit rauskommen


----------



## bn (21. Mai 2003)

deswegen für jeden überpunkt ne eigene root_id, denn dann kannst du noch nach der root_id selektieren


```
//angenommen:
//a -> root_id = 1
//b -> root_id = 2
//c -> root_id = 3
//d -> root_id = 4
$x = 1 //was weiß ich - irgend ein Überpunkt deines Menüs (a)
SELECT node1.baum, node1.baum_id, COUNT(*) AS level FROM baumtab AS node1, baumtab AS node2 
WHERE node1.root_id = '$root_ids[$x]' AND node2.root_id = '$root_ids[$x]' AND node1.lft BETWEEN node2.lft AND node2.rgt GROUP BY node1.LFT
```

ich lese erst alle root_id ist ein array und schleife es dann durch.
wenn die gesuchte root_id (z.b. a) dann an der reihe ist, gebe ich bis level xyz aus ansonsten nur level 1.


----------



## melmager (21. Mai 2003)

nachdem ich noch ein wenig geknobelt habe:
Ein Menu ist mit nested set Modell ist zu aufwendig 

Ich werde mein Bestehendes System etwas aufpeppen und etwas vereinfachen


----------



## ingo preuss (30. Oktober 2005)

bloddy newbie hat gesagt.:
			
		

> ich habe mir das tutorial "Status Quo" solange reingezogen, bis ich es endlich kapiert habe.
> 
> hier gehts zum tutorial
> 
> ...


 
 Das Prinzip hab ich durchgeackert und auch ziemlich verstanden. Was ich jetzt nicht hinkriege, sind die icons den entpsprechenden Dokumenttypen zuzuordnen. Wie kann ich dem entsprechenden Dokument - pdf, txt usw. sein spezifisches Icon geben?

Gruß, Ingo


----------

