MTTP - Kategorien mit Unterkategorien



  • Hallo,

    ich bin gerade dabei mein Programm um Kategorien samt Unterkategorien, usw. zu erweitern. Dabei bin ich auf MTTP (Modified Preorder Tree Traversal) gestoßen.

    Ich habe eine Testdatenbank mit Access aufgesetzt, um das Prinzip dahinter zu verstehen. Soweit ist mir das nun auch klar.

    Allerdings stelle ich mir die Frage, wie ich einem Artikel nun eine Kategorie zuweisen soll.

    ID | Name | KategorieNr

    Ich kann an dieser Stelle meinen Artikel eine Unterkategorie, etc. geben. Aber wenn ich z.B. nur Artikel einer bestimmten Kategorie ausgeben lassen will, wie muss ich das angehen? Schließlich hat die Unterkategorie eine andere Nummer... Daran hänge ich aktuell.

    Eine Abfrage wie SELECT * FROM Artikel WHERE KategorieNr = '11' würde also die Unterkategorien nicht berücksichtigen. Ich müsste also irgendwie noch von der Kategorie-Tabelle alle Unterkategorien abfragen...

    Hier komme ich aber an meine Grenzen und frage daher nun euch, die Experten 🙂



  • Mit mttp kann man einen Baum in einer Datenbank darstellen.
    Da hast du left und right und nicht kategorie id als Felder.

    Siehe: http://iamcam.wordpress.com/2006/03/24/storing-hierarchical-data-in-a-database-part-2a-modified-preorder-tree-traversal/



  • Also der Sinn ist der folgende: Ich habe eine Artikelliste und möchte jeden Artikel in eine Kategorie einordnen.

    Grundsätzlich wäre das ja ganz einfach:

    id_Artikel | Bezeichnung | Kategorie
    0 | CPU | 0
    1 | Maus | 1

    id_Kategorie | Bezeichnung
    0 | Computerteile
    1 | Eingabegeräte

    So, nun reicht mir aber nur eine Haupt-Kategorie nicht aus, sondern ich möchte Unterkategorien vergeben, welche ich meinen Artikeln dann zuordnen kann:

    Also z.B. eine solche Hierachie von Kategorien:

    Computer
    - Hardware
    - Grafikkarten
    - CPU
    - Eingabegeräte
    - Tastatur
    - Maus

    Das Speichern dieser Kategorien ist kein Problem. Dazu hätte ich jetzt das oben beschriebene Verfahren mit dem Tree benutzt. Die Frage ist: Wie weise ich einem Artikel nun eine solche Kategorie zu?

    Im Prinzip könnte ich einfach die id der entsprechenden Kategorie nehmen. Aber wie frage ich dann alle Artikel ab, die in dieser Kategorie bzw. in der Unterkategorie sind? Hier weiß ich leider nicht mehr weiter.



  • **Computer
    **- Hardware
    -- Grafikkarten
    -- CPU
    - Eingabegeräte
    -- Tastatur
    -- Maus



  • fghfgh schrieb:

    Im Prinzip könnte ich einfach die id der entsprechenden Kategorie nehmen. Aber wie frage ich dann alle Artikel ab, die in dieser Kategorie bzw. in der Unterkategorie sind? Hier weiß ich leider nicht mehr weiter.

    Tja, da stößt die relationale Algebra an ihre Grenzen. Gute DBS beherrschen hierarchische Abfragen (z.B. oracle's START WITH ... CONNECT BY). Bei anderen System müsstest Du das umständlich abbilden, also den Pfad mit speichern oder eine Stored function verwenden.

    kategorie
    ---------------------------
    id  | name     | path
    ---------------------------
    1   | hardware | 1-
    2   | input    | 1-2-
    3   | mouse    | 1-2-3-
    

    Und dann über den Pfad abfragen

    WHERE path LIKE '1-2-%'
    

    Sollte alle Eingabegeräte finden. Dirty, dirty.



  • witte schrieb:

    Sollte alle Eingabegeräte finden. Dirty, dirty.

    Dafuer gibts mttp.
    Damit kannst du baeume in einer tabelle darstellen.

    Mein Link erklaert alles. Wenn es fragen gibt: einfach fragen 🙂



  • Und ich muss auch sagen, das ich MTTP wesentlich eleganter finde als alles was da an rekursiven SQL-Erweiterungen geboten wird.
    Zwar wird das erstellen und erweitern des Kategorie-Baums umständlicher, weil man u.U. viele Left- und Right-Values aktualisieren muss, aber wie oft passiert das schon. Viel häufiger sind da ja Suchen und die gehen damit extrem fix.
    Ich habe hier eine MySQL-DB mit 50.000 Einträgen die in ca. 150 Kategorien einsortiert sind. Eine Abfrage darauf dauert genauso lange, als wäre die Kategorisierung flach und kein Baum, bedingt durch die geniale Struktur.

    Man speichert bei den Einträgen ja weiterhin die Kategorie-ID, aber sucht dann anders (Pseudo-SQL):

    SELECT * FROM einträge JOIN kategorie WHERE left BETWEEN suche.left AND suche.right
    

    mfg
    xXx


Anmelden zum Antworten