Lista sąsiedztwa
Najprostszy i najpopularniejszy sposób przechowywania drzewa w SQL: każdy wiersz ma parent_id wskazujące rodzica. Łatwy do zrozumienia i aktualizacji, ale pobranie całych poddrzew wymaga zapytań rekurencyjnych.
Mechanika: tabela odwołująca się do samej siebie, w której parent_id jest kluczem obcym do klucza głównego tej samej tabeli; węzły główne mają NULL. Zaleta: dodawanie i przenoszenie węzłów jest trywialne (wystarczy zmienić parent_id), model jest naturalny i znormalizowany. Cena: pobranie wszystkich potomków lub przodków wymaga albo wielu zapytań (po jednym na poziom), albo rekurencyjnego CTE (WITH RECURSIVE), które przy głębokich drzewach bywa wolne. To klasyczny model, od którego się zaczyna; jeśli odczyt poddrzew stanie się wąskim gardłem, przechodzi się na materialized path, nested set albo closure table. Większość ORM-ów obsługuje go wprost. Domyślny wybór dla hierarchii o umiarkowanym rozmiarze (kategorie, wątki komentarzy, drzewa organizacyjne). Powiązane z zapytaniem rekurencyjnym i materialized path.