Я бы сохранил данные в виде, подобном
CREATE TABLE software (
id SERIAL PRIMARY KEY,
...
);
CREATE TABLE software_dependency (
dependent int NOT NULL REFERENCES software(id),
dependee int NOT NULL REFERENCES software(id),
deptype int, -- or whatever you want
CONSTRAINT pk_software_dependency PRIMARY KEY (dependent, dependee)
);
Вы сможете получить список всех зависимостей с чем-то вроде:
WITH RECURSIVE t(id,type) AS (
SELECT dependee,deptype FROM software_dependency WHERE dependent=3
UNION ALL
SELECT d.dependee,deptype FROM software_dependency d INNER JOIN t ON t.id=d.dependent
)
SELECT * FROM t;
Редактировать: чтобы получить дерево, хорошим способом является накопление зависимостей в формате ARRAY. Для каждого шага в рекурсии используйте оператор добавления массива (||), чтобы добавить новый идентификатор в массив и получить его в конце.