Wie Rekursion modellieren?
Marcel
- datenbank
1 Bio0 Andreas Lindig0 Christian Seiler0 Marcel
Hallo
Habe in einer Datenbank sogenannte Aktionen, z.B. "Zimmer aufräumen", "Staubsaugen" oder "Abstauben". Nun ist es auch möglich, dass "Zimmer aufräumen" aus "Abstauben" und "Staubsaugen" besteht. Wie modelliere ich das am besten?
Mein Vorschlag:
tabelle aktion
id_aktion | beschreibung
----------------------------
1 | Zimmer aufräumen
2 | Abstauben
3 | Staubsaugen
tabelle subaktion
id_aktion | id_subaktion
----------------------------
1 | 2
1 | 3
Ist das richtig so?
Danke.
Gruss Marcel
Sup!
Ist das richtig so?
Ich denke, auf jeden Fall.
Gruesse,
Bio
Hallo Marcel,
hmm..., ich weiß nicht, ob es so gut ist, die Verknüpfungen auszulagern, weil Du ja keine Verknüpfung zu einer anderen Tabelle hast.
Wenn Du jetzt alle Untertätigkeiten von "zimmer aufräumen" suchst, mußt Du ja einen Join von der Haupttabelle zur Verknüpfungstabelle und zurück machen.
Gruß, Andreas
Hallo Marcel,
hmm..., ich weiß nicht, ob es so gut ist, die Verknüpfungen auszulagern, weil Du ja keine Verknüpfung zu einer anderen Tabelle hast.
Wenn Du jetzt alle Untertätigkeiten von "zimmer aufräumen" suchst, mußt Du ja einen Join von der Haupttabelle zur Verknüpfungstabelle und zurück machen.
Gruß, Andreas
Mit SELECT id_subaktionen FROM subaktionen WHERE aktionen.id_aktionen = subaktionen.id_aktionen erhalte ich doch alle Subaktionen die eine Aktion beinhaltet. Mir ist nicht ganz klar was das Problem sein soll...?
Mit SELECT id_subaktionen FROM subaktionen WHERE aktionen.id_aktionen = subaktionen.id_aktionen erhalte ich doch alle Subaktionen die eine Aktion beinhaltet.
nö. Damit erhälst Du zunächst mal alle UnterIDs zu _jeder_ HauptID.
im Allgemeinen wirst Du doch die _Namen_ der Subaktionen suchen und zwar von nur _einer_ Hauptaktion. Was nützt es Deiner Putzfrau, wenn Du ihr einen Zettel ausdruckst: "bitte heute 2, 3 und 5 erledigen." - das geht nur, wenn sie schon länger bei Dir arbeitet und die Bedeutung der Nummern kennt oder eine Liste hat.
Du wirst also fragen wollen: "Mein Freund die Datenbank, welche Aktionen muß ich erledigen um mein Zimmer aufzuräumen?" Und als Antwort willst Du erhalten: "Staubsaugen, Abstauben".
in SQL etwa so:
SELECT beschreibung
FROM aktion, subaktion
WHERE aktion.id_aktion = subaktion.id_aktion
AND id_subaktion = aktion.id_aktion
AND aktion.id_aktion = 1
wobei ich mich gerade frage, ob das _überhaupt_ geht, weil in der letzten Zeile ja schon die Datenmenge auf id = 1 reduziert wird. Evtl. mußt Du also sogar noch zwei Abfragen machen.
Wie dem auch sei. Wenn Du nur die Haupttabelle hast und eine parent_id einführst, kannst Du einfach fragen:
SELECT beschreibung
FROM aktion
WHERE parent_id = 1
Gruß, Andreas
use Mosche;
Wie dem auch sei. Wenn Du nur die Haupttabelle hast und eine parent_id einführst, kannst Du einfach fragen:
SELECT beschreibung
FROM aktion
WHERE parent_id = 1
Meistens (da IDs ja Datenbank-intern sein sollen) muss man da aber noch einen Subrequest einführen:
SELECT beschreibung
FROM aktion
WHERE parent_id = (SELECT id_aktion
FROM aktion
WHERE beschreibung = 'Aufräumen');
Da relativiert sich gleich der Vorteil, denn bei der JOIN-Version kann man einfach die zweite AND-Bedingug ändern, um das gleiche zu erreichen (wobei dein Vorschlag dann immer noch besser dastehen müsste).
use Tschoe qw(Matti);
Sup!
Auf jeden Fall entspricht dieses Modell allen möglichen Normalformen und ist datenbanktheoretisch sicher sehr angebracht...
Gruesse,
Bio
Hallo Marcel,
Mein Vorschlag:
tabelle aktion
id_aktion | beschreibung
1 | Zimmer aufräumen
2 | Abstauben
3 | Staubsaugen
Gegenvorschlag:
id_aktion | beschreibung | id_elternaktion
-------------------------------------------------
1 | Zimmer aufräumen | NULL
2 | Abstauben | 1
3 | Staubsaugen | 1
Jede Aktion kann mehrere Subaktionen haben (oder auch keine), aber eine Aktion hat genau eine Elternaktion (oder gar keine). Somit sparst Du Dir eine Tabelle und kannst mittels SELECT felder FROM aktion WHERE id_elternaktion = 1 ohne JOIN oder sonstwas sofort alle Subaktionen ermitteln. Meine Tabelle entspricht meines Wissens auch der 1., 2. und 3. Normalform.
Achja, hast Du Dir schonmal Nested Sets angeschaut? Das könnte eventuell auch etwas für Dich sein.
Viele Grüße,
Christian
Vielen Dank für eure Ideen und Tipps. Die Sache mit der parent_id wäre eine schöne möglichkeit, aber nicht realisierbar da es Subaktionen geben kann, die mehrere Elternaktionen haben.