Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erzielen Sie eine Hierarchie, eine Eltern-Kind-Beziehung auf effektive und einfache Weise

Wenn Sie das Datenmodell nicht ändern können und MySQL verwenden, stecken Sie leider in einer Situation fest, in der Sie rekursive Abfragen benötigen und ein DBMS verwenden, das keine rekursiven Abfragen unterstützt.

Quassnoi hat eine interessante Reihe von Blogartikeln geschrieben, die Techniken zum Abfragen hierarchischer Daten zeigen. Seine Lösungen sind ziemlich clever, aber sehr komplex. Erklärextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL ist ein weiteres Open-Source-RDBMS, das rekursive Abfragen unterstützt , sodass Sie einen ganzen Baum abrufen könnten, der so gespeichert ist, wie Sie es zeigen. Aber wenn Sie das Datenmodell nicht ändern können, gehe ich davon aus, dass Sie nicht zu einem anderen RDBMS wechseln können.

Es gibt mehrere alternative Datenmodelle, die es viel einfacher machen, beliebig tiefe Bäume abzurufen:

  • Abschlusstabelle
  • Nested Sets, auch bekannt als Modified Preorder Tree Traversal
  • Pfadaufzählung, auch bekannt als materialisierter Pfad

Ich behandle diese in meiner Präsentation Modelle für hierarchische Daten mit SQL und PHP , und in meinem Buch SQL Antipatterns:Avoiding the Pitfalls of Database Programming .

Schließlich gibt es noch eine andere Lösung, die ich im Code für Slashdot verwendet gesehen habe , für ihre Kommentarhierarchien:Sie speichern "parent_id" wie in Adjacency List, aber sie speichern auch eine "root_id"-Spalte. Jedes Mitglied eines gegebenen Baums hat den gleichen Wert für root_id, der der höchste Vorgängerknoten in seinem Baum ist. Dann ist es einfach, einen ganzen Baum in einer Abfrage abzurufen:

SELECT * FROM site WHERE root_id = 123;

Dann ruft Ihre Anwendung alle Knoten aus der Datenbank in ein Array zurück, und Sie müssen den Code schreiben, um dieses Array zu durchlaufen und die Knoten in eine Baumdatenstruktur im Speicher einzufügen. Dies ist eine gute Lösung, wenn Sie viele separate Bäume haben und jeder Baum relativ wenige Einträge hat. Es ist gut für Slashdots Fall.