2013-02-18 3 views
2

Я пытаюсь создать структуру для хранения и чтения пород собак с использованием php и mysql.Генеалогическое дерево mysql

я нашел на StackOverflow этот вид структуры, и, кажется, чтобы быть эффективным: Inbreeding-immune database structure

TABLE people (id, name, father_id, mother_id); 
TABLE relatives (person_id, ancestor_id); 

Существует рабочий пример здесь: http://sqlfiddle.com/#!2/0bd39/10

Можно получить просто упорядоченное дерево или поддерево (например, 4 или 5 поколений), начиная с идентификатора?

EDIT

Я пытаюсь получить данные с помощью первой таблицы ... но с 4-5 поколений в результате запроса очень и очень тяжелым. Я боюсь, что с большим количеством информации в БД, генеалогия может быть очень медленной и непригодной для использования.

SELECT 
    t1.name AS lev1, t2.name as f, ff1.name as ff1, fm1.name as fm1, t3.name as m, 
    mf1.name as mf1, mm1.name as mm1, ....... 
FROM people AS t1 
LEFT JOIN people AS t2 ON t2.id = t1.father_id 
LEFT JOIN people AS ff1 ON ff1.id = t2.father_id 
LEFT JOIN people AS fm1 ON fm1.id = t2.mother_id 
    ... 
LEFT JOIN people AS t3 ON t3.id = t1.mother_id 
LEFT JOIN people AS mf1 ON mf1.id = t3.father_id 
LEFT JOIN people AS mm1 ON mm1.id = t3.mother_id 
    ... 
WHERE t1.id = 6; 
+1

Ваша проблема нелегко решить. Вы можете посмотреть (под лицензией Creative Commons) в моем родовом веб-приложении, но обратите внимание, что это бета-версия и немецкий (извините!). [link] (http://www.zujab.at/stm.zip) – idmean

+0

Я знаю, что это непросто решить. И я пытаюсь найти какое-то предложение для лучшей структуры, используемой с ограничениями mysql. – Danilo

+2

См. Мой ответ на http://stackoverflow.com/questions/192220/what-is-the-most-efficient-elegant-way-to-parse-a-flat-table-into-a-tree/192462#192462 –

ответ

2

Этот вид, вероятно, лучше подходит для магазина данных graph. Что-то похожее на то, как facebook поддерживает иерархию отношений.

Если вы связаны и настроены на использование MySQL, вы, вероятно, можете уйти с вашей схемой, используя рекурсивный поиск. Так как ваше дерево может иметь переменную глубину, вы можете начать самосоединение в определенном месте и «пройти» по рекурсивной ветви, пока вы не найдете больше потомков. Верните эту ветку и начните следующую. Аналогичный процесс для поиска родителей.

+0

Мне нужно использовать mysql. Я также хочу пересечь дерево с помощью рекурсивного подхода ... но я полагаю, что необходимо использовать php. Считаете ли вы, что быстрее один запрос, такой как тот, который я написал в моем отредактированном вопросе, или быстрее работает с простыми рекурсивными запросами, управлял моей рекурсивной функцией php? – Danilo

+1

Использование запрограммированного запроса ограничит вас фиксированной глубиной. Если это приемлемо, то это, безусловно, проще, чем вложение нескольких запросов. – ethrbunny

1

У меня была эта проблема с линиями рыб. Я обнаружил, что наилучшим решением было сбросить список смежности (например, тот, который вы опубликовали), к специальному строителю дерева, например GraphViz.

+0

На самом деле у меня нет возможности установить другое программное обеспечение на веб-сервере, но, похоже, очень полезно, что tree builder – Danilo

Смежные вопросы