Heim >Backend-Entwicklung >PHP-Tutorial >Speichermethode für Baumdatenstrukturen (Abfrage)

Speichermethode für Baumdatenstrukturen (Abfrage)

藏色散人
藏色散人nach vorne
2019-09-07 11:05:303347Durchsuche

Adjazenzlistenmodell

In der täglichen Geschäftsentwicklung stoßen wir häufig auf baumartige Daten mit einer hierarchischen Struktur. Bei der Speicherung in einer relationalen Datenbank wird diese Datenstruktur oft in einem Modell namens Adjazenzliste gespeichert, etwa so:

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(100) NOT NULL,
  `pid` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Speichermethode für Baumdatenstrukturen (Abfrage)

Dieses Modell stellt dar. Das Bild zeigt:

Speichermethode für Baumdatenstrukturen (Abfrage)

Ich glaube, dass viele Menschen bereits mit diesem Datenmodell vertraut sind, daher werde ich hier nicht zu sehr ins Detail gehen. Konzentrieren wir uns auf das folgende Datenmodell

Nested Set Model

Eine andere Möglichkeit, einen Baum darzustellen, besteht darin, ihn als Menge zu speichern. Wir definieren die folgende Tabellenstruktur neu:

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(100) NOT NULL,
  `lft` int(11) NOT NULL UNIQUE CHECK (lft> 0),
  `rgt` int(11) NOT NULL UNIQUE CHECK (rgt> 1),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Speichermethode für Baumdatenstrukturen (Abfrage)

Und das Diagramm dieses Modells sieht wie folgt aus:

Speichermethode für Baumdatenstrukturen (Abfrage)

lft und rgt werden als Grenze der Menge verwendet. Je größer der Unterschied zwischen den beiden ist, desto größer ist die Menge und desto mehr Elemente enthält sie.

Suchen Sie entsprechend der Teilmenge die Kategorie des übergeordneten Elements.

SELECT c2.* 
  FROM categories as c1, categories as c2
  WHERE c1.lft BETWEEN c2.lft and c2.rgt 
      AND c1.title = '华为';
+----+-------------+-----+-----+
| id | title       | lft | rgt |
+----+-------------+-----+-----+
|  1 | Smartphones |   1 |  14 |
|  5 | Harmony OS  |  10 |  13 |
|  8 | 华为        |  11 |  12 |
+----+-------------+-----+-----+

Suchen Sie entsprechend dem übergeordneten Element alle darunter liegenden Teilmengen.

SELECT c1.*
   FROM categories AS c1, categories AS c2
  WHERE c1.lft BETWEEN c2.lft AND c2.rgt
    AND c2.title = 'Smartphones';
+----+-------------+-----+-----+
| id | title       | lft | rgt |
+----+-------------+-----+-----+
|  1 | Smartphones |   1 |  14 |
|  3 | Android     |   2 |   5 |
|  4 | iOS         |   6 |   9 |
|  5 | Harmony OS  |  10 |  13 |
|  6 | 小米        |   3 |   4 |
|  7 | iPhone      |   7 |   8 |
|  8 | 华为        |  11 |  12 |
+----+-------------+-----+-----+

Sehen Sie sich die Ebene jeder Kategorie an.

 SELECT COUNT(c2.id) AS indentation, c1.title
  FROM categories AS c1, categories AS c2下周三we'fv
  WHERE c1.lft BETWEEN c2.lft AND c2.rgt
  GROUP BY c1.title
  ORDER BY c1.lft;
+-------------+-------------+
| indentation | title       |
+-------------+-------------+
|           1 | Smartphones |
|           2 | Android     |
|           3 | 小米        |
|           2 | iOS         |
|           3 | iPhone      |
|           2 | Harmony OS  |
|           3 | 华为        |
+-------------+-------------+

Vor- und Nachteile

Adjazenzlistenmodell

Das Adjazenzlistenmodell ist leicht zu verstehen, und der Code, den wir benötigen, ist es auch ganz einfach.

Aber in den meisten Programmiersprachen ist es langsam und ineffizient. Dies wird hauptsächlich durch Rekursion verursacht. Wir müssen für jeden Knoten im Baum eine Datenbankabfrage durchführen.

Dies kann die Funktion bei der Verarbeitung großer Bäume sehr langsam machen, da jede Abfrage einige Zeit in Anspruch nimmt. Denn für jede Funktion ist ein rekursiver Algorithmus erforderlich, um die Zahl zu erhalten.

Wenn Sie eine rekursivfreundliche Sprache wie List verwenden, können Sie die Mängel dieses Datenmodells natürlich ignorieren. Bei PHP wird die gesamte Verarbeitung dieses Datenmodells jedoch extrem langsam.

Nested-Set-Modell

Im Vergleich zum Adjazenzlistenmodell ist dieses Datenmodell offensichtlich nicht so einfach zu verstehen. Und das Hinzufügen von Daten kann nicht so einfach sein. Beim Hinzufügen müssen die Werte auf der linken und rechten Seite berechnet und die nachfolgenden Werte verschoben werden, was den Druck beim Hinzufügen von Daten erhöht.

Der Vorteil besteht auch darin, dass Sie eine Baumabfrage mit einer einfachen Abfrage abschließen können und anhand der beiden Parameter lft und rgt berechnen können, wie viele Unterelemente sie enthält.

Zusammenfassung

Beide Modelle haben ihre eigenen Vor- und Nachteile, eines ist besser als Einfügen und das andere ist besser als Abfrage. Obwohl ich das Nested-Set-Modell bevorzuge, muss es dennoch basierend auf dem jeweiligen Unternehmen ausgewählt werden.

Das obige ist der detaillierte Inhalt vonSpeichermethode für Baumdatenstrukturen (Abfrage). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen