MySQL nie ma rekurencyjnych zapytań, które są częścią standardowego SQL. Wiele innych marek baz danych obsługuje tę funkcję, w tym PostgreSQL (patrz http://www.postgresql.org/docs/8.4/static/queries-with.html ).
Istnieje kilka technik obsługi danych hierarchicznych w MySQL.
- Najprostsze byłoby dodanie kolumny, aby odnotować hierarchię, do której należy dane zdjęcie. Następnie możesz wyszukać zdjęcia należące do tej samej hierarchii, pobrać je wszystkie z powrotem do aplikacji i znaleźć te, których tam potrzebujesz. Jest to trochę marnotrawne pod względem przepustowości, wymaga napisania większej ilości kodu aplikacji i nie jest dobre, jeśli twoje drzewa mają wiele węzłów.
Istnieje również kilka sprytnych technik przechowywania danych hierarchicznych, dzięki czemu można je wyszukiwać:
-
Wyliczanie ścieżek przechowuje listę przodków z każdym węzłem. Na przykład zdjęcie 5 w twoim przykładzie przechowuje „0-2-4-5”. Możesz szukać przodków, wyszukując węzły, których ścieżka połączona z "%" jest dopasowana do ścieżki 5 z
LIKE
orzeczenie. -
Zestawy zagnieżdżone to złożona, ale sprytna technika spopularyzowana przez Joe Celko w jego artykułach i książce „Trees and Hierarchical in SQL for Smarties”. Istnieje również wiele blogów internetowych i artykułów na ten temat. Zapytanie o drzewa jest łatwe, ale trudne jest zapytanie o bezpośrednie dzieci lub rodziców i trudne do wstawiania lub usuwania węzłów.
-
Tabela zamknięcia wiąże się z przechowywaniem każdej relacji przodek/potomek w osobnej tabeli. Jeśli dodasz pathlength, łatwo jest zadawać zapytania do drzew, wstawiać i usuwać, a także wysyłać zapytania do bezpośrednich rodziców lub dzieci kolumna.
Więcej informacji porównujących te metody można znaleźć w mojej prezentacji Praktyczny obiekt -Zorientowane modele w SQL lub moja nadchodząca książka Antywzorce SQL:unikanie pułapek programowania baz danych .