Mysql speichert Baumstruktur durch Adjazenzliste (Adjazenzliste)

Mysql speichert Baumstruktur durch Adjazenzliste (Adjazenzliste)

Der folgende Inhalt stellt den Prozess und die Lösung von MySQL vor, bei dem die Adjazenzliste zum Speichern der Baumstruktur verwendet wird, und analysiert das gespeicherte Diagramm.

Heute wollen wir uns mit einem schwierigeren Problem befassen: Wie speichert man eine Baumstruktur in einer Datenbank?

Relationale Datenbanken wie MySQL eignen sich besser zum Speichern flacher Daten wie Tabellen, sind jedoch bei tiefen Daten wie Baumstrukturen schwer zu kontrollieren.

Beispielsweise müssen wir die Personalstruktur des Unternehmens speichern. Die allgemeine hierarchische Struktur ist wie folgt:

(Ein Bild zu zeichnen ist nicht einfach..)

Wie also wird diese Struktur gespeichert? Und holen Sie sich folgende Informationen:

1. Finden Sie heraus, wer Xiaotians direkter Vorgesetzter ist.

2. Überprüfen Sie die direkten Mitarbeiter unter der Leitung von Lao Song.

3. Überprüfen Sie alle Vorgesetzten von Xiaotian.

4. Fragen Sie alle von Lao Wang verwalteten Mitarbeiter ab.

Lösung 1: (Adjazenzliste) speichert nur die übergeordneten Knoteninformationen des aktuellen Knotens.

CREATE TABLE Mitarbeiter(
eid int,
ename VARCHAR(100),
Position VARCHAR (100),
übergeordnete_id int
)

Die aufgezeichneten Informationen sind einfach und grob, daher speichern Sie jetzt diese Strukturinformationen:

OK, kommen wir nun zum Antwortteil:

1. Anfrage an Xiaotians direkten Vorgesetzten:

WÄHLEN Sie e2.eid, e2.ename VON Mitarbeiter e1, Mitarbeiter e2, WO e1.parent_id=e2.eid UND e1.ename='Mitarbeiter';

2. Befragen Sie die direkten Mitarbeiter unter der Leitung von Lao Song:

WÄHLEN Sie e1.eid, e1.ename VON Mitarbeiter e1, Mitarbeiter e2, WO e1.parent_id=e2.eid UND e2.ename='Mitarbeiter';

3. Überprüfen Sie alle Vorgesetzten von Xiaotian.

Hier gibt es definitiv keine Möglichkeit, direkt zu prüfen. Sie können nur eine Schleife verwenden, um in einer Schleife abzufragen. Überprüfen Sie zuerst den direkten Vorgesetzten, dann den direkten Vorgesetzten des direkten Vorgesetzten und so weiter. Für so eine lästige Sache müssen Sie immer noch zuerst eine gespeicherte Prozedur erstellen:

Augen auf und genau hinschauen, der nächste Schritt ist die Show-Operation:

CREATE DEFINER=`root`@`localhost` FUNCTION `getSuperiors`(`uid` int) GIBT varchar(1000) CHARSET gb2312 ZURÜCK
BEGINNEN
  DECLARE Vorgesetzte VARCHAR(1000) DEFAULT '';
  DECLARE sTemp INTEGER DEFAULT uid;
  DECLARE tmpName VARCHAR(20);
  WÄHREND (sTemp>0) TUN
    Wählen Sie parent_id in sTemp aus, wobei eid = sTemp ist.
    Wählen Sie ename in tmpName aus, wobei eid = sTemp;
    WENN(sTemp>0)DANN
      SET Vorgesetzte = concat(tmpName,',',Vorgesetzte);
    ENDE, WENN;
  ENDE WÄHREND;
    SETze Vorgesetzte = LINKS(Vorgesetzte, ZEICHENLÄNGE(Vorgesetzte)-1);
  RÜCKKEHR Vorgesetzte;
ENDE

Diese gespeicherte Prozedur kann alle übergeordneten Knoten der untergeordneten Knoten abfragen. Probieren wir es aus.

Okay, der Vorgang ist abgeschlossen.

Anscheinend das. Es ist mühsam, alle übergeordneten Knoten eines untergeordneten Knotens abzurufen. .

4. Fragen Sie alle von Lao Wang verwalteten Mitarbeiter ab.

Die Idee ist folgende: Holen Sie sich zuerst die Mitarbeiter-IDs aller Mitarbeiter, deren übergeordneter Knoten die ID von Lao Wang ist, fügen Sie dann den Namen des Mitarbeiters zur Ergebnisliste hinzu und rufen Sie dann eine magische Suchfunktion auf, um eine magische Suche durchzuführen:

CREATE DEFINER=`root`@`localhost` FUNCTION `getSubordinate`(`uid` int) GIBT varchar(2000) CHARSET gb2312 ZURÜCK
BEGINNEN
DECLARE str varchar(1000);
DECLARE cid varchar(100);
DECLARE-Ergebnis VARCHAR (1000);
DECLARE tmpName VARCHAR(100);
SETZEN Sie str = "$";
SET cid = CAST(uid als char(10));
WHILE cid ist nicht null DO
SET str = concat(str, ',', cid);
Wählen Sie group_concat (eid) INTO cid FROM Mitarbeiter, wobei FIND_IN_SET (parent_id, cid);
ENDE WÄHREND;
SELECT GROUP_CONCAT(ename) INTO Ergebnis FROM Mitarbeiter WHERE FIND_IN_SET(parent_id,str);
RETURN-Ergebnis;
ENDE

Sehen Sie die erstaunlichen Ergebnisse:

Obwohl ich es herausgefunden habe, war es ehrlich gesagt nicht einfach. . .

Der Vorteil dieser Methode besteht darin, dass weniger Informationen gespeichert werden müssen und sie sehr praktisch ist, um direkte Vorgesetzte und direkte Untergebene zu überprüfen. Der Nachteil besteht darin, dass mehrstufige Abfragen sehr schwierig durchzuführen sind. Wenn Sie also nur die direkte Vorgesetzten-Untergebenen-Beziehung verwenden müssen, ist diese Methode immer noch eine gute Wahl und kann viel Platz sparen. Später werden noch weitere Aufbewahrungslösungen vorgestellt. Einen absoluten Unterschied zwischen gut und schlecht gibt es nicht, sie eignen sich lediglich für unterschiedliche Anlässe.

Das könnte Sie auch interessieren:
  • MySQL-Datenbanktabellendesign mit Baumstruktur

<<:  Zusammenfassung von 4 Möglichkeiten zum Hinzufügen von Benutzern zu Gruppen in Linux

>>:  Vue realisiert Preiskalendereffekt

Artikel empfehlen

Lösung für das Problem der MySQL-Transaktionsparallelität

Ich bin während der Entwicklung auf ein solches P...

JS realisiert die Kartenausgabe-Animation

In diesem Artikelbeispiel wird der spezifische JS...

Vue implementiert mehrere Ideen zum Themenwechsel

Inhaltsverzeichnis Themen dynamisch ändern Die er...

js Array-Einträge () Holen Sie sich die Iterationsmethode

Inhaltsverzeichnis 1. Detaillierte Syntax der Met...

js implementiert Axios Limit-Anforderungswarteschlange

Inhaltsverzeichnis Der Hintergrund ist: Was wird ...

Spezifische Verwendung von useRef in React

Ich glaube, dass Leute, die Erfahrung mit React h...

Drei Möglichkeiten zur Kommunikation zwischen Docker-Containern

Wir alle wissen, dass Docker-Container voneinande...

Der praktische Prozess des Login-Status-Managements im vuex-Projekt

Inhaltsverzeichnis Werkzeug: Anmeldeszenario: übe...