Первая проблема, схема данных проекта : Я храню иерархию с внешним ключом для родительской строки. Это просто.
Вторая проблема, получение потомков / потомков : Как вы объяснили, проблемы возникают с выбором: выберите несколько человек и всех потомков или потомков. Чтобы решить эту проблему, вы должны создать новую таблицу дерева. Эта таблица содержит пары: все комбинации с человеком со всеми его предками (и с самим собой):
people( id, name, id_parent)
people_tree( id, id_ancestor, distance )
Обратите внимание, что с этой структурой легко запрашивать иерархии. Пример: все потомки кого-то:
select people.*, distance
from
people p
inner join
people_tree t
on ( p.id = t.id)
where
id_ancesor = **sombody.id **
Вы можете играть на расстоянии, чтобы получить только бабушку и дедушку, внуков и т. Д. ...
Последняя проблема, сохранить дерево : дерево должно быть все время до данных. Вы должны автоматизировать это: триггер над people
или процедура сохранения для операций CRUD,
EDITED
Поскольку это генеалогическое древо, у каждого человека должны быть и ссылки, и родитель, и мать:
people( id, name, id_parent, id_mother)
Затем нужно 2 дерева:
parent_ancestors_tree( id, id_ancestor, distance )
mother_ancestors_tree( id, id_ancestor, distance )
Дэвид попросит образец данных:
people: id name id_parent id_mother
1 Adam NULL NULL
2 Eva NULL NULL
3 Cain 1 2
.. ...
8 Enoc 3 5
parent_ancestors_tree id id_ancestor distance
(Adam) 1 1 0
(Eva) 2 2 0
(Cain) 3 3 0
3 1 1
(Enoc) 8 8 0
8 3 1
8 1 2
mother_ancestors_tree id id_ancestor distance
(Adam) 1 1 0
(Eva) 2 2 0
(Cain) 3 3 0
3 2 1
(Enoc) 8 8 0
-- here ancestors of Enoc's mother --
привет.