MySQL hat keine rekursiven Abfragen, die Teil von Standard-SQL sind. Viele andere Datenbankmarken unterstützen diese Funktion, einschließlich PostgreSQL (siehe http://www.postgresql.org/docs/8.4/static/queries-with.html ).
Es gibt mehrere Techniken für den Umgang mit hierarchischen Daten in MySQL.
- Am einfachsten wäre es, eine Spalte hinzuzufügen, um die Hierarchie anzugeben, zu der ein bestimmtes Foto gehört. Dann können Sie nach den Fotos suchen, die zur gleichen Hierarchie gehören, sie alle zurück in Ihre Anwendung holen und herausfinden, welche Sie dort benötigen. Dies ist etwas verschwenderisch in Bezug auf Bandbreite, erfordert, dass Sie mehr Anwendungscode schreiben, und es ist nicht gut, wenn Ihre Bäume viele Knoten haben.
Es gibt auch ein paar clevere Techniken, um hierarchische Daten zu speichern, damit Sie sie abfragen können:
-
Pfadaufzählung speichert die Liste der Vorfahren mit jedem Knoten. Zum Beispiel würde Foto 5 in Ihrem Beispiel "0-2-4-5" speichern. Sie können nach Vorfahren suchen, indem Sie nach Knoten suchen, deren mit „%“ verketteter Pfad mit dem Pfad von 5 mit einem
LIKE
übereinstimmt Prädikat. -
Verschachtelte Sätze ist eine komplexe, aber clevere Technik, die von Joe Celko in seinen Artikeln und seinem Buch „Trees and Hierarchical in SQL for Smarties“ populär gemacht wurde. Es gibt auch zahlreiche Online-Blogs und Artikel darüber. Es ist einfach, Bäume abzufragen, aber schwierig, direkte Kinder oder Eltern abzufragen, und es ist schwierig, Knoten einzufügen oder zu löschen.
-
Abschlusstabelle beinhaltet das Speichern jeder Vorfahren/Nachkommen-Beziehung in einer separaten Tabelle. Es ist einfach, Bäume abzufragen, einfach einzufügen und zu löschen und direkte Eltern oder Kinder abzufragen, wenn Sie eine Pfadlänge hinzufügen Spalte.
Weitere Informationen zum Vergleich dieser Methoden finden Sie in meiner Präsentation Practical Object -Orientierte Modelle in SQL oder mein kommendes Buch SQL Antipatterns:Avoiding the Pitfalls of Database Programming .