Ankündigung

Einklappen
Keine Ankündigung bisher.

parent -> nested set

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • parent -> nested set

    Hallo!

    Also ich brauche das zwar momentan nicht, es würde mich aber trotzdem interessieren. Die Frage richtet sich an echte Datenbank-Profis

    Angenommen, ich habe:

    tabelle:

    id: integer not null auto-increment primary-key
    parent_id: integer
    name: varchar(100)

    Beispiel:
    Code:
    id parent_id name
    1  null      haupt1
    2  null      haupt2
    3  1         sub1 von haupt1
    4  1         sub2 von haupt1
    5  2         sub1 von haupt2
    Kann man daraus mittels SELECT ein nested set bilden?

    Warum frage ich das? Weil mir aufgefallen ist, dass nested sets ziemlich komplex sind und manchmal eine parent-Beziehung einfacher wäre.

    Sicher könnte man das auch kombinieren, sodass man dann so etwas hätte:

    id: integer not null auto-increment primary-key
    parent_id: integer
    lft: integer not null
    rgt: integer not null
    name: varchar(100)

    Siehe http://dev.mysql.com/tech-resources/...ical-data.html

    Aber mich würde interessieren, ob man auch direkt aus parent-Beziehungen mittels SELECT ein nested set bilden könnte.

  • #2
    Kurze Antwort: Nein

    Lange Antwort: Nein, weil...ein Nested Set darauf angewiesen ist, das left und right Werte zur Verfügung stehen. Alles andere ist nur eine andere Art eine Baumstruktur in einer DB zu speichern aber eben kein Nested Set.

    Was du wohl eher suchst, ist ein Query um den ganzen Baum auf einmal und nicht rekursiv abzufragen.
    Also ohne Rekursion ist es möglich, aber nicht in einem Query.
    Du musst zunächst die Strucktur des Baums haben, also eigentlich nur die maximale Tiefe.
    Mit diesen Daten kannst du einen Query schreiben, der den kompletten Baum auf einmal abfragt. Wie das genau geht, weiß ich auch nicht mehr, da wird dir Google aber mit sicherheit bei helfen.

    Kommentar


    • #3
      das left und right Werte zur Verfügung stehen.
      Das wäre ja dann das gewünschte Ergebnis.

      Dass ich also von einer parent-Beziehung ausgehe und mir im SELECT diese beiden Werte ermittle.

      Wie gesagt. Ich brauche das jetzt nicht. Vielleicht ist es auch unlogisch, so zu arbeiten. Ich weiß es nicht. Mich würde nur interessieren, ob es möglich wäre. Ich glaube nämlich schon, dass das irgendwie möglich sein sollte. Aber für so etwas reichen meine MySQL-Kenntnisse noch nicht aus.

      Kommentar


      • #4
        Also ein Konverter lässt sich durchaus auch mit SQL (oder passender: Compound-Statement Syntax) formulieren. Es ist nur halt nich möglich, mit einem SELECT einen kompletten Baum so auszulesen, dass er genau der Struktur einer zukünftigen Nested Set Tabelle entspricht.

        INSERT ... SELECT ist da also außen vor...

        Gruß Jens

        Kommentar


        • #5
          Compound-Statement Syntax
          Was ist das? Eine MySQL-Funktion bzw. -Prozedur?

          Kommentar


          • #6
            Compound Statement Syntax ist Teilmenge dessen, was Du z.B. MySQL erzählen musst, wenn Du ne Stored Procedure erstellst. Relevant für das Problem sind hier die Kontrollflusssteuerungsfunktionalitäten, sprich die Möglichkeit eine Schleife zu basteln.

            Gruß Jens

            Kommentar


            • #7
              Hallo,

              da ich mittlerweile auch nested sets einsetze und vor allem begriffen habe kann ich dir dazu nur anraten dich damit auseinander zu setzen.

              Es dient halt dazu hierarchische Datenbäume mit nur einem einzigen Query abzubilden. Wohlbemerkt macht es eigentlich nur dann Sinn wenn eine recht große Tiefe etc. zusammenkommen kann und viele auf diese Baumstruktur zugreifen können. Beim Parent Model bist du gezwungen rekursiv zu arbeiten und das kann bei vielen Zugriffen auf einmal natürlich ein DB schon mal in die Knie zwingen.

              Setze dich mal damit auseinander. Was fertiges gibts da auch schonvon Pear.

              Gruß Litter

              Kommentar


              • #8
                Das dachte ich mir auch schon, dass man so eine Umwandlung nur machen kann, wenn man ein SQL-Script programmiert.

                Ich vermute, diese Umwandlung würde relativ viel Zeit in Anspruch nehmen. Zumindest mehr Zeit, als wenn ich gleich direkt mit den nested sets arbeite.

                Wäre aber dennoch interessant, so ein SQL-Script zu sehen, das von einer parent-Struktur in eine nested-set-Struktur umwandelt. Aber wie schon erwähnt. Das ist nichts, was ich jetzt brauchen würde.

                EDIT:
                kann ich dir dazu nur anraten dich damit auseinander zu setzen
                Habe das in meinem Projekt schon alles voll ausprogrammiert im nested-set-Stil. Das funktioniert schon alles. Hinzufügen, Löschen, Breadcrumbs, Subtrees, ... Habe mich also schon damit auseinandergesetzt

                Kommentar


                • #9
                  Zitat von litterauspirna Beitrag anzeigen
                  Beim Parent Model bist du gezwungen rekursiv zu arbeiten und das kann bei vielen Zugriffen auf einmal natürlich ein DB schon mal in die Knie zwingen.
                  Ein Nested Set mit entsprechender Datenmenge und "ein paar" neuen Nodes auch

                  Kommentar


                  • #10
                    Zitat von G.Schuster Beitrag anzeigen
                    Ein Nested Set mit entsprechender Datenmenge und "ein paar" neuen Nodes auch
                    Aber nicht im Frontend. Probleme macht das dann wieder da wenn Bäume oder Teilbäume gelöscht oder verschoben werden müssen.

                    Kommentar


                    • #11
                      Genau darauf wollte ich hinaus - wenn man viele Daten hat und dann z.B. neue Nodes einfügen will, für die viele andere verschoben werden müssen.

                      Kommentar


                      • #12
                        Ok da hatte ich deine Aussage falsch verstanden.

                        Kommentar

                        Lädt...
                        X