Има няколко алтернативи за улесняване на работа с йерархична информация в SQL:
-
Общи таблични изрази (съгласно стандарта SQL-2003) поддържат рекурсивни SQL заявки спрямо типа родителски идентификатор данни, които използвате. Засега MySQL не поддържа тази функция. PostgreSQL 8.4, Microsoft SQL Server и IBM DB2 са примери за марки RDBMS, които поддържат CTE синтаксис. Oracle също има собствено разширение за SQL синтаксис, което поддържа рекурсивни заявки.
-
Вложени набори (лявото/дясното решение, което @phantombrain споменава) е решение, подробно описано в книгата на Джо Селко „Дървета и йерархии в SQL за Smarties“, както и в множество статии и публикации в блогове в интернет.
-
Изброяване на пътя (известен още като Материализиран път) съхранява низ във всеки ред в йерархията, за да отбележи пътя на предците на този ред. Комбинирайте това с
LIKE
заявки за сравняване на низа за път с пътищата на предците и пътищата на потомците. -
Таблица за затваряне (известен още като Transitive Closure Relation) използва втора таблица за съхраняване на всички връзки предшественик-потомник, а не само непосредствения родител, както в дизайна, който използвате. Много видове заявки стават по-лесни, след като съхраните всички пътища.
-
Хибридни решения също съществуват. Например, съхранявайте непосредствения родителски идентификатор, както правите, но също и корена на дървото. Сега можете да получите всички други редове в същата йерархия, да ги извлечете в кода на приложението и да сортирате дървото с конвенционални структури от данни.