Моделирование переменной глубины наследования в MySQL - PullRequest
0 голосов
/ 26 января 2012

Я работаю над проектом, в котором мне нужно иметь данные, наследуемые на разной глубине, и затем иметь возможность возвращать любых потомков определенного фрагмента данных.Я работаю с географическими регионами, поэтому я думал о том, чтобы иметь таблицу «Region», и у меня есть все, от «Северной Америки» до отдельных районов, таких как «Бронкс».Так, если кто-то печатает в «Северной Америке», он также должен получить результаты для «Бронкса», потому что «Бронкс» является потомком «Северной Америки» посредством отношения North America->United States->New York(State)->New York(City)->Bronx

В моей БД япланировал иметь ссылку на таблицу регионов обратно на саму себя с таблицей, в которой указаны родительско-дочерние отношения между регионами.Вот пример того, что я хотел бы предложить: enter image description here

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 26 января 2012

Вам не нужен новый стол. Достаточно внешнего ключа в основной таблице.

Это мой подход:

Первая проблема, схема данных проекта : Я храню иерархию с внешним ключом для родительской строки. Это просто. У вас есть пример с областями иерархии здесь :

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,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...