php / Mysql beste Baumstruktur

Lesezeit: 4 Minuten

php Mysql beste Baumstruktur
Marm

Ich muss einen Baum erstellen, der etwa 300 Knoten enthält. Der Baum hat keine Tiefenbegrenzung. Es kann also 3 oder 15 Ebenen haben. Jeder Knoten kann eine unbegrenzte Anzahl von Kindern haben.

Die Priorität ist es, so schnell wie möglich einen vollständigen Baum / Teilbaum zu erhalten, aber ich muss manchmal auch Knoten hinzufügen oder Knoten verschieben, aber nicht so oft.

Ich möchte wissen, wie man den Baum am besten in der Datenbank speichert und wie man die Daten, wenn möglich, in PHP am besten abruft.

1646321051 845 php Mysql beste Baumstruktur
webbiedave

Sie können eine verwenden Nested-Set-Modell da es sehr effiziente Abfragen liefert. Kasse Verwalten hierarchischer Daten in MySQL und lesen Sie den genannten Abschnitt Nested-Set-Modell.

Wenn Sie ein ORM wie Doctrine verwenden, ist es enthält verschachtelte Set-Fähigkeiten.

Für einige kann es schwierig sein, die verschachtelten Mengenkonzepte von zu verstehen links und rechts. Ich habe festgestellt, dass die Verwendung dieser Zahlen als Analogie für die Zeilennummern von Open/Close-Tags in einem XML-Dokument einfacher zu verstehen ist.

Nehmen Sie zum Beispiel das Datenbeispiel aus dem obigen MySQL-Link:

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |
+-------------+----------------------+-----+-----+

Nimmst du die lft, rechts Felder und verwenden Sie sie als Zeilennummern für ein XML-Dokument, erhalten Sie:

1. <electronics>
2.    <televisions>
3.        <tube>
4.        </tube>
5.        <lcd>
6.        </lcd>
7.        <plasma>  
8.        </plasma> 
9.     </televisions>
10.    <portable electronics>
11.        <mp3 players>
12.            <flash>
13.            </flash>
14.        </mp3 players>
15.        <cd players>
16.        </cd players>
17.        <2 way radios>
18.        </2 way radios>
19.    </portable electronics>
20. </electronics>

Wenn Sie es so sehen, kann es für einige viel einfacher sein, sich die resultierende verschachtelte Mengenhierarchie vorzustellen. Es wird auch klarer, warum dieser Ansatz die Effizienz verbessert, da er es ermöglicht, ganze Knoten auszuwählen, ohne dass mehrere Abfragen oder Verknüpfungen erforderlich sind.

  • Ich konnte mich nie zurechtfinden sparen hierarchische Daten, bis Sie es so einfach ausdrücken.

    – Dunhamzzz

    14. August 2012 um 23:13 Uhr

  • Up-Voting für die Zeilennummern-Analogie. Das ist erstaunlich und ich „verstehe“ es jetzt sofort!

    – Martin Bean

    2. Oktober 2013 um 9:24 Uhr

1646321051 775 php Mysql beste Baumstruktur
Markus

Das ist ein toller Artikel darüber: Verwalten hierarchischer Daten in MySQL. Ich habe lange gebraucht.

Wenn Sie mathematische Fähigkeiten haben, können Sie wirklich verstehen, warum es so großartig ist!

            <?php

            $host = "localhost";
            //Database user name.   
            $login = "root";
            //Database Password.
            $dbpass = "";
            $dbname = "abc";
            $PDO = new PDO("mysql:host=localhost;dbname=$dbname", "$login", "$dbpass");
            $rows = array();
            $sql="SELECT id, parent_id, name FROM employee";
            $query = $PDO->prepare($sql);
            $query->execute();
            $rows = array();

                if (!$query)
                {
                    $error="Error fetching page structure, for nav menu generation.";
                    exit();
                }

            while($row = $query->fetch(PDO::FETCH_ASSOC)){
                if( strcasecmp($row['parent_id'],'null') === 0 || empty($row['parent_id']) ) {
                     $row['parent_id'] = null;
                }

                $rows[] = $row;
            }


            // covert raw result set to tree
            $menu = convertAdjacencyListToTree(null,$rows,'id','parent_id','links');
            // echo '<pre>',print_r($menu),'</pre>';

            // display menu
            echo themeMenu($menu,1);

            /*
            * ------------------------------------------------------------------------------------
            * Utility functions
            * ------------------------------------------------------------------------------------
            */

            /*
            * Convert adjacency list to hierarchical tree
            *
            * @param value of root level parent most likely null or 0
            * @param array result
            * @param str name of primary key column
            * @param str name of parent_id column - most likely parent_id
            * @param str name of index that children will reside ie. children, etc
            * @return array tree
            */
            function convertAdjacencyListToTree($intParentId,&$arrRows,$strIdField,$strParentsIdField,$strNameResolution) {

                $arrChildren = array();

                for($i=0;$i<count($arrRows);$i++) {
                    if($intParentId === $arrRows[$i][$strParentsIdField]) {
                        $arrChildren = array_merge($arrChildren,array_splice($arrRows,$i--,1));
                    }
                }

                $intChildren = count($arrChildren);
                if($intChildren != 0) {
                    for($i=0;$i<$intChildren;$i++) {
                        $arrChildren[$i][$strNameResolution] = convertAdjacencyListToTree($arrChildren[$i][$strIdField],$arrRows,$strIdField,$strParentsIdField,$strNameResolution);
                    }
                }

                return $arrChildren;

            }

            /*
            * Theme menu
            *
            * @param array menu
            * @param runner (depth)
            * @return str themed menu
            */
            function themeMenu($menu,$runner) {

                $out="";

                if(empty($menu)) {
                    return $out;
                }

                $out.='<ul>';
                foreach($menu as $link) {
                    $out.= sprintf(
                        '<li class="depth-%u">%s%s</li>'
                        ,$runner
                        ,$link['name']
                        ,themeMenu($link['links'],($runner+1))
                    );
                }

                $out.='</ul>';
                return $out;

            }

            ?>

924750cookie-checkphp / Mysql beste Baumstruktur

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy