MySQL postrádá rekurzivní dotazy, které jsou součástí standardního SQL. Tuto funkci podporuje mnoho dalších značek databází, včetně PostgreSQL (viz http://www.postgresql.org/docs/8.4/static/queries-with.html ).
Existuje několik technik pro manipulaci s hierarchickými daty v MySQL.
- Nejjednodušší by bylo přidat sloupec s hierarchií, do které daná fotografie patří. Poté můžete vyhledat fotografie, které patří do stejné hierarchie, načíst je všechny zpět do aplikace a zjistit, které tam potřebujete. To je trochu plýtvání z hlediska šířky pásma, vyžaduje to, abyste napsali více kódu aplikace, a není dobré, když vaše stromy mají mnoho uzlů.
Existuje také několik chytrých technik pro ukládání hierarchických dat, abyste je mohli dotazovat:
-
Výčet cesty ukládá seznam předků s každým uzlem. Například fotografie 5 ve vašem příkladu bude obsahovat „0-2-4-5“. Předky můžete hledat vyhledáním uzlů, jejichž cesta zřetězená s "%" odpovídá cestě 5 s
LIKE
predikát. -
Vnořené sady je složitá, ale chytrá technika popularizovaná Joe Celkem ve svých článcích a své knize "Stromy a hierarchie v SQL pro Smarties." Existuje také mnoho online blogů a článků o tom. Je snadné dotazovat se na stromy, ale obtížné je dotazovat se bezprostředních dětí nebo rodičů a obtížné vkládat nebo mazat uzly.
-
Uzavírací tabulka zahrnuje ukládání každého vztahu předek/potomek do samostatné tabulky. Pokud přidáte délku cesty, je snadné dotazovat se na stromy, snadno vkládat a mazat a snadno se dotazovat přímých rodičů nebo dětí sloupec.
Více informací o porovnání těchto metod můžete vidět v mé prezentaci Practical Object -Orientované modely v SQL nebo moje připravovaná kniha SQL Antipatterns:Avoiding the Ptfalls of Database Programming .