Marcel: Wie Rekursion modellieren?

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

  1. Sup!

    Ist das richtig so?

    Ich denke, auf jeden Fall.

    Gruesse,

    Bio

    --
    Keep your friends close, but your enemies closer!
  2. 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

    --
    SELFFORUM - hier werden Sie geholfen,
    auch in Fragen zu richtiges Deutsch
    1. 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...?

      1. 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

        --
        SELFFORUM - hier werden Sie geholfen,
        auch in Fragen zu richtiges Deutsch
        1. 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);

          --
          Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
          Webapplikationen in C++ entwickeln
    2. Sup!

      Auf jeden Fall entspricht dieses Modell allen möglichen Normalformen und ist datenbanktheoretisch sicher sehr angebracht...

      Gruesse,

      Bio

      --
      Keep your friends close, but your enemies closer!
  3. 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

  4. 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.