В MySQL липсват рекурсивни заявки, които са част от стандартния SQL. Много други марки бази данни поддържат тази функция, включително PostgreSQL (вижте http://www.postgresql.org/docs/8.4/static/queries-with.html ).
Има няколко техники за работа с йерархични данни в MySQL.
- Най-простото би било да добавите колона, за да отбележите йерархията, към която принадлежи дадена снимка. След това можете да потърсите снимките, които принадлежат към една и съща йерархия, да ги върнете обратно във вашето приложение и да разберете нужните ви там. Това е леко разточително по отношение на честотната лента, изисква от вас да напишете повече код на приложението и не е добре, ако вашите дървета имат много възли.
Има и няколко умни техники за съхраняване на йерархични данни, така че да можете да ги запитвате:
-
Изброяване на пътя съхранява списъка на предците с всеки възел. Например снимка 5 във вашия пример ще съхранява "0-2-4-5". Можете да търсите предци, като потърсите възли, чийто път, свързан с "%", съответства на пътя на 5 с
LIKE
предикат. -
Вложени набори е сложна, но умна техника, популяризирана от Джо Селко в неговите статии и книгата му „Дървета и йерархично в SQL за Smarties“. Има много онлайн блогове и статии за това. Лесно е да се правят заявки за дървета, но е трудно да се правят заявки за непосредствени деца или родители и е трудно за вмъкване или изтриване на възли.
-
Таблица за затваряне включва съхраняване на всяка връзка предшественик/наследник в отделна таблица. Лесно е да се правят заявки за дървета, лесно се вмъкват и изтриват и лесно се правят запитвания към непосредствени родители или деца, ако добавите дължина на пътя колона.
Можете да видите повече информация, сравняваща тези методи в моята презентация Practical Object -Ориентирани модели в SQL или предстоящата ми книга SQL Antipatterns:Избягване на клопките на програмирането на бази данни .