Вам не нужен новый стол. Достаточно внешнего ключа в основной таблице.
Это мой подход:
Первая проблема, схема данных проекта : Я храню иерархию с внешним ключом для родительской строки. Это просто. У вас есть пример с областями иерархии здесь :
WOE_ID ISO Name Language PlaceType Parent_ID
20069843 "NA" "Oshana" ENG State 23424987
55921113 "NA" "Ondangwa" ENG County 20069843
...
Вторая проблема, получение наследников / потомков : Как вы объяснили, проблемы возникают с select: выберите какой-то регион и всех потомков или потомков. Чтобы решить эту проблему, вы должны создать новую таблицу дерева. Эта таблица содержит пары: все комбинации человека со всеми его предками (и собой):
region( id, name, id_parent)
region_tree( id, id_ancestor, distance )
Обратите внимание, что с этой структурой легко запрашивать иерархии. Пример: все потомки какого-то региона:
select region.*, distance
from
region p
inner join
region_tree t
on ( p.id = t.id)
where
id_ancesor = **someregion.id **
Вы можете играть с расстоянием, чтобы получить только субрегионы, субрегионы, ...
Последняя проблема, сохранить дерево : дерево должно быть все время до данных. Вы должны автоматизировать это: триггер на region
или процедура сохранения для операций CRUD,