Mehrere Wurzeln bei Nested Sets

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

  • Mehrere Wurzeln bei Nested Sets

    ist eventuell ein leidiges Thema was ich so rauskriege bei dem Suchbegriff Nested Sets aber ...

    Ich habe das Prinzip verstanden und verwende es bereits ...
    nun möchte ich aber eine 2te Wurzelkategorie erstellen und ebenfalls die knotenpunkte der 1ten Wurzel einfügen können.

    jedoch sollte ebenfalls möglich sein diese 2te Wurzelkategorie mitsammt der Knotenpunkte der 1ten Wurzel in einer bestimmten Ebene abzulegen.


    So sollte das Grundgerüßt aussehen:
    Wurzelkat1
    |---Knotenp1
    |++++|-Blatt1
    |++++|-Blatt2
    |---Knotenp2
    |++++|-Blatt3

    Wurzelkat2
    |++++|-Blatt1
    |++++|-Blatt2
    |---Knotenp2
    |++++|-Blatt3

    Am Ende solls so aussehen

    Wurzelkat1
    |---Knotenp1
    |++++|-Blatt1
    |++++|-Wurzelkat2
    |++++|+++|-Blatt1
    |++++|+++|-Blatt2
    |++++|+++|---Knotenp2
    |++++|+++++++|-Blatt3
    |++++|-Blatt2
    |---Knotenp2
    |++++|-Blatt3



    Hoffe mein zeichnerisches können veranschaulicht ungefair das was ich beabsichtige zu fragen..

    das Tut von kempert http://www.klempert.de/nested_sets/artikel/ ist da schon wesentlich leicht und verständlich erklärt nur wird immer davon ausgegangen das es nur eine Wurzel gibt....

    Hoffe ihr könnt mir da etwas auf die Sprünge helfen
    danke ....

  • #2
    Wenn ich dich richtig verstehe, gibt es ja auch bei dir nur eine Wurzel. Durch das Einfügen ins erste Set wird ja aus Wurzelkat2 ein ganz normaler Knoten. Das sieht dann in deiner Notation etwa so aus:
    Code:
    Wurzelkat1
    |---Knotenp1
    |++++|-Blatt1.1
    |++++|-Knotenp1.1 (ex Wurzelkat2)
    |++++|+++|-Blatt1.1.1
    |++++|+++|-Blatt1.1.2
    |++++|+++|---Knotenp1.1.1
    |++++|+++++++|-Blatt1.1.1.1
    |++++|-Blatt1.2
    |---Knotenp2
    |++++|-Blatt2.1
    Gruss
    H2O

    Kommentar


    • #3
      Willst du einem Element in mehrere Sets legen? Wenn nein, dann verstehe ich dein Problem leider nicht ganz (deine "Zeichnung" scheint nämlich etwas inskonsistent).

      Am besten, du erklärst dein Problem auch an konkreten Beispielen. Was soll eine Wurzelkategorie sein, was ein Knotenpunkt (eigentlich ist jedes Element in einem Nested Sets Baum ein Knotenpunk) und was die Blätter.
      [FONT="Helvetica"]twitter.com/unset[/FONT]

      Shitstorm Podcast – Wöchentliches Auskotzen

      Kommentar


      • #4
        Stimmt wenn ichs mir so recht überlege habe ich mich missverständlich ausgedrückt
        im prinzip möchte ich gerne nur eine Tabelle haben die aber mehrere Wurzeln hat , diese wurzeln ich aber im nachhinein miteinander verknüpfen möchte.. im konkreten Bsp.

        ich habe eine Gruppe Autos und eine Gruppe Menschen
        laut nested set kann ich aber diese beiden Gruppen nicht jeweils als Wurzel in einer Tabelle halten, da man ja davon ausgeht das die wurzel immer = 1 ist
        bsp.:

        Tabelle tree
        id name lft rgt
        ----------------------
        | 1 | Gruppe1 | 1 | 2 |

        füge ich nun eine Untergruppe in die Gruppe1 so sieht das ganze ja so aus :
        Tabelle tree
        id name lft rgt
        ----------------------
        | 1 | Gruppe1 | 1 | 4 |
        ----------------------
        | 2 | Ugruppe | 2 | 3 |

        somit ist ja sichergestellt das der Wert des tree.name die Wurzel ist wo lft = 1 ..

        was aber wenn ich mehrere Wurzeln haben möchte ?
        z.bsp.:
        Tabelle tree
        id name lft rgt
        ----------------------
        | 1 | Gruppe1 | 1 | 4 |
        ----------------------
        | 2 | Ugruppe | 2 | 3 |

        und
        | 3 | Gruppe2 | 1 | 4 |
        ----------------------
        | 4 | Ugruppe1| 2 | 3 |

        Punkt1.: Wie muss ich rgt und lft werte verändern damit ich immer weiß was denn nun wurzel ist ?
        Punkt2.: Wie kann ich sicherstellen das ich die Gruppe2, die ja eigentlich ein Wurzelelement ist mit einer Ugruppe ist, in das Wurzelelement der Gruppe1 einfügen kann ?

        Kommentar


        • #5
          Also, erstmal ist es uninterssant, welche "id" die Wurzel hat. Genaugenommen muss der Links-Wert nichtmal 1 sein. Wichtig ist nur, dass alle Kindelemente einen höheren Linkswert haben.

          Dein Problemn lässt sich doch ganz einfach lösen:

          Code:
          id | name                       | links | rechts
          ------------------------------------------------
          1  | Wurzel                     | 1     | 14
          2  | Gruppe 1                   | 2     | 7
          3  | Kindelement 1 von Gruppe 1 | 3     | 4
          4  | Kindelement 2 von Gruppe 1 | 5     | 6
          5  | Gruppe 2                   | 8     | 13
          6  | Kindelement 1 von Gruppe 2 | 9     | 10
          7  | Kindelement 2 von Gruppe 2 | 11    | 12
          Wenn du nun nur Gruppe 1 auslesen willst, nimmst du alle Records der Tabelle, die einen größeren Linkswert als 2 und einen kleineren Rechtswert als 7 haben.

          Bei Gruppe zwei dann natürlich Links größer 8 und Rechts kleiner 13.

          Das ist ja grade der Sinn von Nested Sets: Gruppenelemente verschachteln.
          [FONT="Helvetica"]twitter.com/unset[/FONT]

          Shitstorm Podcast – Wöchentliches Auskotzen

          Kommentar


          • #6
            im prinzip haste ja recht jetzt möchte ich aber die Gruppenbehandlung so einfach stricken wie möglich ..

            möchte ich jetzt laut deiner Tabelle eine neue Gruppe einfügen müsste ich bei allen Einträgen die unter Wurzel sind die links und rechts Werte ändern.

            genauso beim löschen einer Gruppe oder Verschieben einer Gruppe und so weiter ...

            Wenn ich jedoch es hinbekomme das ich eine Wurzel habe die alleine für ist so umgehe ich bei 50 oder 100 Gruppen immer wieder die Tabelle neu zu ordnen.
            verstehste was ich meine ?

            Kommentar


            • #7
              Original geschrieben von Postaria
              im prinzip haste ja recht jetzt möchte ich aber die Gruppenbehandlung so einfach stricken wie möglich ..

              möchte ich jetzt laut deiner Tabelle eine neue Gruppe einfügen müsste ich bei allen Einträgen die unter Wurzel sind die links und rechts Werte ändern.

              genauso beim löschen einer Gruppe oder Verschieben einer Gruppe und so weiter ...

              Wenn ich jedoch es hinbekomme das ich eine Wurzel habe die alleine für ist so umgehe ich bei 50 oder 100 Gruppen immer wieder die Tabelle neu zu ordnen.
              verstehste was ich meine ?
              Ja, aber das wirst du nicht umgehen können. Denn entweder du arbeitest mit Nested Sets und liest performant aus, oder du strickst dir das Prinzip so um, dass du ressourcenfressend einlesen musst (denn du musst dir dann die Links- und Rechtswerte trotzdem berechnen, wenn du deinen Baum haben willst - was in einem Kolbenfresserquery oder hundert kleinen Queries geschehen wird) aber schnell und einfach ändern kannst. Das ist aber nicht nur deswegen eine Milchmädchenrechnung, weil du eh öfter lesen als schreiben wirst, sondern auch, weil du die Unterbäume trotzdem genau so aufwändig wie einen großen manipulieren musst, wenn sich etwas ändert.
              [FONT="Helvetica"]twitter.com/unset[/FONT]

              Shitstorm Podcast – Wöchentliches Auskotzen

              Kommentar


              • #8
                ja die links und rechts werde muss ich natürlich ändern sobald ein Element einer Wurzel hinzugefügt wird. Jedoch muss ich ja dann nur DIE links und rechtswerte ändern die auch zu der jeweiligen wurzel gehören ...

                ich bin grade dabei eine Tabelle aufzubauen die mir eventuell bei meiner Idee behilflich sein kann ...

                folgenden Aufbau habe ich mir überlegt ...

                id wurzel_id name lft rgt
                ----------------------------------------
                1 | 1 | Gruppe1 | 1 | 10 |
                2 | 1 | Ugruppe1 | 2 | 3 |
                5 | 1 | Ugruppe2 | 4 | 5 |
                6 | 1 | Ugruppe3 | 6 | 7 |
                7 | 1 | Ugruppe4 | 8 | 9 |
                ---
                3 | 2 | Gruppe1 | 1 | 10 |
                4 | 2 | Ugruppe1 | 2 | 3 |
                8 | 2 | Ugruppe2 | 4 | 5 |
                9 | 2 | Ugruppe3 | 6 | 7 |
                10 | 2 | Ugruppe4 | 8 | 9 |


                Mal schauen ob mir das irgendwie weiterhilft
                bei der handhabung ..

                Kommentar


                • #9
                  So wirst du aber nicht mehr den gesamten Baum (perfomant) einlesen können.
                  [FONT="Helvetica"]twitter.com/unset[/FONT]

                  Shitstorm Podcast – Wöchentliches Auskotzen

                  Kommentar


                  • #10
                    es ist in dem sinne ja auch nicht ein Baum sondern 2 Bäume
                    und wenn ich einem der Bäume einen AST hinzufügen möchte dann geschieht das auch nahtlos ohne die anderen Bäume zu stören.
                    So kann ich auch alle Bäume mit deren Ästen anzeigen und deren Blättern usw.

                    So ist zumindestens die Theorie

                    aber hmm ... an der Praxis wie mir scheint happerts bei mir grade ..

                    Kommentar


                    • #11
                      :sigh: Na, ein drittes mal werde ich es dir nicht sagen. Nur soviel: Du hast das Konzept von Nested Sets nicht vollständig verstanden.
                      [FONT="Helvetica"]twitter.com/unset[/FONT]

                      Shitstorm Podcast – Wöchentliches Auskotzen

                      Kommentar


                      • #12
                        Ich hab das Prinzip verstanden, er will einfach nur in einer Datenbank Tabelle mehrer Menü´s eintragen (zB. Main Menü, Footer Menü, usw...)

                        Ich würde auch gerne wissen wie das SQL dann aussieht.

                        Code:
                        SELECT
                        n.id, n.menu, n.name, n.link, COUNT(*)-1 AS level
                        FROM
                        `menu` AS n,
                        `menu` AS p
                        WHERE
                        n.left BETWEEN p.left AND p.right
                        GROUP BY n.left
                        ORDER BY n.left
                        So jetzt müsste man nur noch irgendwie in der WHERE Bedingung einfügen menu='main' oder halt 'footer'

                        Aber ich bekomme es auch nicht ganz hin...

                        Kommentar


                        • #13
                          hier gibt es noch ein Tutorials zum thema Nested Sets mit mySQL

                          Das 'Nested Sets' Modell - Bäume mit SQL PHP Tutorials nicht nur für Anfänger php-resource.de

                          php-Entwicklung | ebiz-consult.de
                          PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
                          die PHP Marktplatz-Software | ebiz-trader.de

                          Kommentar

                          Lädt...
                          X