EinführungBei der Entwicklung stoßen wir häufig auf baumstrukturierte Szenarien. In diesem Artikel werden die Vor- und Nachteile verschiedener Designs am Beispiel der Abteilungstabelle verglichen. Frage Bedarfshintergrund : Personalsuche nach Abteilung. Rekursion? Rekursion kann dieses Problem lösen, wird aber zwangsläufig Leistung verbrauchen Design 1: Adjazenzliste Hinweis: (Gemeinsames Design der übergeordneten ID) TischdesignCREATE TABLE `dept_info01` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren', `dept_id` int(10) NOT NULL COMMENT 'Abteilungs-ID', `dept_name` varchar(100) NOT NULL COMMENT 'Abteilungsname', `dept_parent_id` int(11) NOT NULL COMMENT 'Übergeordnete Abteilungs-ID', `create_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP KOMMENTAR 'Erstellungszeit', `update_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Änderungszeit', PRIMÄRSCHLÜSSEL (`id`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; Dies ist das am häufigsten verwendete Design, mit dem die Baumstruktur des Menüs ohne redundante Daten korrekt ausgedrückt werden kann. Allerdings erfordern ebenenübergreifende Abfragen eine rekursive Verarbeitung. SQL-Beispiele1. Abfrage der direkten Teilmenge eines Knotens Wählen Sie * aus dept_info01, wobei dept_parent_id = 1001 ist. Vorteil Einfache Struktur; Mangel 1. Es ist unmöglich, alle Eltern und alle Kinder eines Knotens ohne Rekursion abzufragen Entwurf 2: PfadaufzählungBasierend auf Design 1 wird ein übergeordnetes Abteilungs-ID-Set-Feld hinzugefügt, um alle übergeordneten Sets zu speichern, wobei mehrere Sets durch feste Trennzeichen wie Kommas getrennt sind. TischdesignCREATE TABLE `dept_info02` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren', `dept_id` int(10) NOT NULL COMMENT 'Abteilungs-ID', `dept_name` varchar(100) NOT NULL COMMENT 'Abteilungsname', `dept_parent_id` int(11) NOT NULL COMMENT 'Übergeordnete Abteilungs-ID', `dept_parent_ids` varchar(255) NOT NULL DEFAULT '' COMMENT 'Übergeordnete Abteilungs-ID festgelegt', `create_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP KOMMENTAR 'Erstellungszeit', `update_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Änderungszeit', PRIMÄRSCHLÜSSEL (`id`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; SQL-Beispiele 1. Alle Teilmengen abfragen WÄHLEN * AUS dept_info02 WO dept_parent_ids wie „%1001%“ 2). Es wird empfohlen, die Funktion FIND_IN_SET zu verwenden WÄHLEN * AUS dept_info02 WO FIND_IN_SET( '1001', Abteilungs-Eltern-IDs ) Vorteil
Mangel
Design 3: Verschlusstabelle
TischdesignHaupttabelle CREATE TABLE `dept_info03` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren', `dept_id` int(10) NOT NULL COMMENT 'Abteilungs-ID', `dept_name` varchar(100) NOT NULL COMMENT 'Abteilungsname', `create_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP KOMMENTAR 'Erstellungszeit', `update_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Änderungszeit', PRIMÄRSCHLÜSSEL (`id`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; Tabelle der Vorfahren-Nachkommen-Beziehungen CREATE TABLE `dept_tree_path_info` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren', `Vorfahr` int(10) NICHT NULL KOMMENTAR 'Vorfahr-ID', `Nachkomme` int(10) NICHT NULL KOMMENTAR 'Nachkomme-ID', `Tiefe` tinyint(4) NICHT NULL STANDARD '0' KOMMENTAR 'Leveltiefe', PRIMÄRSCHLÜSSEL (`id`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; Hinweis: Tiefe ist das Ebenentiefenfeld. Die Selbstreferenz ist 1, der direkte untergeordnete Knoten ist 2, die nächste Ebene ist 3 und so weiter. Die Ebene ist dasselbe wie die Ebene. SQL-BeispieleEinfügen eines neuen Knotens INSERT INTO dept_tree_path_info (Vorfahr, Nachfahre, Tiefe) Wählen Sie t.ancestor, 3001, t.depth+1 FROM dept_tree_path_info AS t WO t.Nachkomme = 2001 UNION ALLE WÄHLEN SIE 3001,3001,1 Alle Vorfahren abfragen WÄHLEN C.* AUS dept_info03 AS c INNER JOIN dept_tree_path_info t ON c.dept_id = t.ancestor WO t.Nachkomme = 3001 Alle Nachkommen abfragen WÄHLEN C.* AUS dept_info03 AS c INNER JOIN dept_tree_path_info t ON c.dept_id = t.descendant WO t.Vorfahr = 1001 Alle Teilbäume löschen LÖSCHEN AUS Abteilungsbaumpfadinfo WO Nachkomme IN ( WÄHLEN eine.Abteilungs-ID AUS ( SELECT Nachkomme dept_id FROM dept_tree_path_info WHERE Vorfahr = 1001 ) ein ) Blattknoten löschen LÖSCHEN AUS Abteilungsbaumpfadinfo WO Nachkomme = 2001 Mobiler Knoten
Vorteil
Mangel
Verwendung in KombinationDie Adjazenzlistenmethode kann mit der Closure-Table-Methode kombiniert werden. Tatsächlich wird die übergeordnete ID redundant zur Haupttabelle hinzugefügt. In einigen Unternehmen, die nur direkte Beziehungen abfragen müssen, kann die Haupttabelle direkt abgefragt werden, ohne dass zwei Tabellen verknüpft werden müssen. Die Vorfahren-Nachkommen-Beziehungstabelle ist insbesondere dann wichtig, wenn ebenenübergreifende Abfragen erforderlich sind. TischdesignHaupttabelle CREATE TABLE `dept_info04` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren', `dept_id` int(10) NOT NULL COMMENT 'Abteilungs-ID', `dept_name` varchar(100) NOT NULL COMMENT 'Abteilungsname', `dept_parent_id` int(11) NOT NULL COMMENT 'Übergeordnete Abteilungs-ID', `create_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP KOMMENTAR 'Erstellungszeit', `update_time` datetime NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Änderungszeit', PRIMÄRSCHLÜSSEL (`id`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; Tabelle der Vorfahren-Nachkommen-Beziehungen CREATE TABLE `dept_tree_path_info` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren', `Vorfahr` int(10) NICHT NULL KOMMENTAR 'Vorfahr-ID', `Nachkomme` int(10) NICHT NULL KOMMENTAR 'Nachkomme-ID', `Tiefe` tinyint(4) NICHT NULL STANDARD '0' KOMMENTAR 'Leveltiefe', PRIMÄRSCHLÜSSEL (`id`) MIT BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; ZusammenfassenTatsächlich habe ich in meiner früheren Arbeit unterschiedliche Arten von Designs gesehen, darunter Adjazenzlisten, Pfadaufzählungen und Adjazenzlisten und Pfadaufzählungen zusammen. Jedes Design hat seine eigenen Vor- und Nachteile und das Design, für das Sie sich entscheiden, hängt davon ab, welche Vorgänge in Ihrer Anwendung die meiste Leistungsoptimierung benötigen.
Zusammenfassend
Damit ist dieser Artikel über die Analyse und den Austausch der Vor- und Nachteile von drei Designs von baumstrukturierten Tabellen in MySQL abgeschlossen. Weitere relevante Inhalte zu baumstrukturierten MySQL-Tabellen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Ist es einfach, mit Vue3 eine Popup-Komponente zu kapseln?
>>: Einige allgemeine Eigenschaften von CSS
Beeinflusst Farbe die Website-Besucher? Vor einig...
Inhaltsverzeichnis Zusammenfassung Einfaches Beis...
In diesem Artikel wird der spezifische Code von j...
<meta name="viewport" content="B...
Vorwort Das dreispaltige Layout ist, wie der Name...
1. Melden Sie sich bei MySQL an und verwenden Sie...
Beim Verschieben von Bausteinen treten verschiede...
Inhaltsverzeichnis 1. Docker installieren 2. Inst...
1. Jenkins-Installationsschritte: https://www.jb5...
Einführung Wenn wir die MySQL-Datenbank verwenden...
Clickhouse-Einführung ClickHouse ist ein spalteno...
Hintergrund Mit der Entwicklung des Geschäfts exp...
MySQL-Batch löschen großer Datenmengen Angenommen...
1. Einführung in mysqlbackup mysqlbackup ist die ...
Spezifische Methode: Schritt 1: Stoppen Sie den M...