Вы не указали свою базу данных, но, глядя на вашу ссылку на ориентированные ациклические графы, я увидел, что вы используете PostgreSQL. Если вы можете согласиться с новейшей версией 8.4, вы можете попробовать следующее (это должно ответить на ваш второй вопрос):
Использование таблицы
create table Tree(
id serial primary key check(id > 0),
parent int references Tree(id),
name varchar(100) not null unique check(length(name)>0),
attr1 int,
attr2 varchar(15),
constraint charlength check(id > parent)
);
заполнено этими данными
insert into Tree (name, parent, attr1, attr2)
values ('Foo', null, 5, 'high'), -- will have id 1
('Bar1', 1, null, 'low'), -- will have id 2
('Bar2', 1, null, null),
('Bar3', 2, null, null);
запрос
with recursive parents(id, name, attr1, attr2, parent, level, who) as (
select id, name, attr1, attr2, parent, 1, id
from Tree t
where t.name in ('Bar3', 'Bar2')
union all
select t.id, p.name, coalesce(p.attr1, t.attr1), coalesce(p.attr2, t.attr2), t.parent, p.level+1, p.who
from parents p, Tree t
where t.id = p.parent
) select distinct on (who) who, name, attr1, attr2
from parents
order by who, level desc;
приводит к (с моей программой ruby, оборачивающей запросы):
{"attr1"=>"5", "name"=>"Bar2", "attr2"=>"high", "who"=>"3"}
{"attr1"=>"5", "name"=>"Bar3", "attr2"=>"low", "who"=>"4"}
Насчет вашего первого вопроса, я не уверен, что вы имеете в виду. Но, может быть, вы можете восстановить XML из его представления в базе данных?!? На ваш третий вопрос я надеюсь, что смогу опубликовать в эти выходные альтернативу для хранения деревьев. В противном случае я бы сказал, что ваши идеи мне нравятся.