Datenbankschema für Kategorisierung erstellen

Hallo Postgres Gruppe,

Ich habe heute einmal eine Frage bzgl. Entwurf eines Datenbankschemas.
Ich habe zunächst einmal Indikatoren, welche in einer Tabelle gespeichert sind. Diese Indikatoren sollen nun in beliebig viele Kategorien und Unterkategorien eingeteilt werden können.
Jede Oberkategorie sollte dabei x Unterkategorien haben können und jede Unterkategorie wieder x weitere Unterkategorien. Jeder Indikator kann in beliebig viele Unterkategorien eingeteilt werden, d.h. ein Indikator kann auch in mehreren Unterkategorien vorkommen.
Der user soll dann in einem späteren Schritt über eine Web-Oberfläche die Zuteilungen der Indikatoren zu den Kategorien machen können oder diese ändern können usw.
Ich bin jetzt etwas af dem Schlauch und bekomme das DB Schema hierzu nicht hin. Mit nur einer Kategorie ist es noch relativ einfach indem ich eine Tabelle Kategorien machen und eine Verknüpfungstabelle mit den ids der Indikator-Tabelle und der Kategorien-Tabelle anlegen.
Ich bin mir aber nicht ganz sicher wie ich die theoretisch beliebig vielen Unter-Kategorien und wieder Unter-Unter-Kategorien abbilden kann, bzw. wie ich sicher gehen kann, dass die Verbindung der Ober-Kategorien mit den zugehörigen Unterkategorien abgebildet wird.

Ich hoffe ich habe mich nicht allzu umstädnlich formuliert und jemand erkennt was ich meine. Theoretisch sollte so etwas doch möglich sein, oder?
Für jede Hilfe und jeden Tipp bedanke ich mich schon einmal recht herzlich im Voraus.

Mit freundlichem Gruss
Hanno

Klingt nach rekursiven Abfragen. Vor einiger Zeit zeigte ich hier wohl mal dieses beispiel:

test=*# select * from pfump;
 id | parent |   value
----+--------+-----------
  1 |        | MS Office
  2 |      1 | Excel
  3 |      1 | Word
  4 |        | Win XP
  5 |      4 | Explorer
  6 |      5 | Dateien
  7 |      5 | Desktop
  8 |      4 | Registry
  9 |      4 | System
 10 |      9 | Boot
 11 |      9 | Netzwerk
 12 |        | Win 7
 13 |     12 | Explorer
 14 |     13 | Dateien
 15 |     13 | Desktop
 16 |     12 | Registry
 17 |     12 | System
(17 rows)

test=*# \dS+ demo_rekursion
             View "public.demo_rekursion"
  Column  | Type | Modifiers | Storage  | Description
----------+------+-----------+----------+-------------
 ?column? | text |           | extended |
 value    | text |           | extended |
View definition:
 WITH RECURSIVE r AS (
                 SELECT pfump.id, pfump.parent, pfump.value, 0 AS count
                   FROM pfump
                  WHERE pfump.parent IS NULL
        UNION ALL
                 SELECT p.id, p.parent, p.value, r.count + 1
                   FROM pfump p, r
                  WHERE r.id = p.parent
        )
 SELECT repeat('-'::text, r.count) || '>'::text, r.value
   FROM r
  ORDER BY r.id;

test=*# select * from demo_rekursion;
 ?column? |   value
----------+-----------
 >        | MS Office
 ->       | Excel
 ->       | Word
 >        | Win XP
 ->       | Explorer
 -->      | Dateien
 -->      | Desktop
 ->       | Registry
 ->       | System
 -->      | Boot
 -->      | Netzwerk
 >        | Win 7
 ->       | Explorer
 -->      | Dateien
 -->      | Desktop
 ->       | Registry
 ->       | System
(17 rows)

Andreas

Sorry, hatte vorhin Bearbeiten statt Zitieren erwischt. Kaffeemangel, …