Cuando se llevan estructuras de árbol a una base de datos, es común utilizar un esquema como este:
CREATE TABLE nodos
(
id int primary key,
idpadre integer REFERENCES nodos (id),
nombre varchar
);
Una vez hecho esto, podemos insertar algunos datos para crear la estructura:
INSERT INTO nodos (id, nombre) VALUES (1, 'Raíz');
INSERT INTO nodos (id, nombre, idpadre) VALUES (2, 'Nodo 1', 1);
INSERT INTO nodos (id, nombre, idpadre) VALUES (3, 'Nodo 2', 1);
INSERT INTO nodos (id, nombre, idpadre) VALUES (4, 'Nodo 3', 2);
INSERT INTO nodos (id, nombre, idpadre) VALUES (5, 'Nodo 4', 4);
Con estos datos, tendremos una estructura como esta:
Raíz (1)
|-- Nodo 1 (2)
| |-- Nodo 3 (4)
| |-- Nodo 4 (5)
|-- Nodo 2 (3)
Supongamos que queremos saber todos los nodos padres del "Nodo 4" (ID: 5). Para esto, PostgreSQL provee consultas recursivas. Acá un ejemplo de cómo podemos realizar la consulta para este nodo:
WITH RECURSIVE arbol (idpadre, idnodo) AS (
SELECT
n.idpadre,
n.id
FROM
nodos n
WHERE
n.id = 5
UNION ALL
SELECT n2.idpadre, n2.id
FROM arbol a INNER JOIN nodos n2
ON (n2.id = a.idpadre)
)
SELECT * FROM arbol
Esta simple consulta, retornará:
idpadre | idnodo
---------+--------
4 | 5
2 | 4
1 | 2
| 1
Espero que les sirva ;)