Etwas, das hier nicht erwähnt wird, obwohl es ein wenig ähnlich wie die zweite Alternative der akzeptierten Antwort ist, aber anders ist und für große Hierarchieabfragen kostengünstig und einfach (einfügen aktualisieren löschen) Elemente, wäre das Hinzufügen einer persistenten Pfadspalte für jedes Element.
manche mögen:
id | name | path
19 | Kategorie1 | /19
20 | Kategorie2 | /19/20
21 | Kategorie3 | /19/20/21
22 | Kategorie4 | /19/20/21/22
Beispiel:
-- Kinder von Kategorie3 abrufen:
SELECT * FROM meine_tabelle WHERE path LIKE '/19/20/21%'
-- Verschieben eines Elements:
UPDATE meine_tabelle SET path = REPLACE(path, '/19/20', '/15/16') WHERE path LIKE '/19/20/%'
Optimieren Sie die Pfadlänge und ORDER BY path
mit Base36-Codierung anstelle von echten numerischen Pfad-IDs
// Base10 => Base36
'1' => '1',
'10' => 'A',
'100' => '2S',
'1000' => 'RS',
'10000' => '7PS',
'100000' => '255S',
'1000000' => 'LFLS',
'1000000000' => 'GJDGXS',
'1000000000000' => 'CRE66I9S'
https://de.wikipedia.org/wiki/Base36
Unterdrückung auch des Schrägstrich '/' Trennzeichens durch Verwendung einer festen Länge und Auffüllen mit der codierten ID
Detaillierte Optimierungserklärung hier: https://bojanz.wordpress.com/2014/04/25/storing-hierarchical-data-materialized-path/
AUFTRAG
Erstellen einer Funktion oder Prozedur zum Aufteilen des Pfads, um Vorfahren eines Elements abzurufen