сохранение данных дерева в базе данных (генеалогическое дерево) - PullRequest
3 голосов
/ 09 июня 2011

Я пытаюсь хранить семейное древо. Вот платформа, которую я использую, Zend Framework, Mysql, Ajax Я искал stackoverflow, я наткнулся на этот пост, который очень полезен при обработке данных с точки зрения объектов.

Структура данных "Семейное древо"

Кратко проиллюстрирую свой вариант использования. Пользователь может создавать членов семьи или друзей на основе нескольких отношений, определенных в базе данных. У меня тоже есть Модель для отношений. Пользователь может создавать членов семьи, как разведенные супруги, фринды. Макс Дерево может быть глубоким, что мы считаем максимальным для детей внуков, но оно также может расширяться в ширину. Брат / сестра и их семья.

Я ищу эффективный дизайн базы данных для меньшего времени запроса. Если мне нужно использовать структуры данных, описанные в посте выше, где я должен хранить их по мере необходимости, это должна быть Модель.

Для представления я планирую использовать Визуализация: организационная структура из http://code.google.com/apis/chart/interactive/docs/gallery/orgchart.html#Example

Я подведу итог, что мне нужно

  1. Дизайн базы данных
  2. Размещение контроллеров (ajax) и моделей
  3. Люди, которых будет создавать пользователь, не будут другими пользователями. просто некоторые другие данные

Да, вот и все! Я выложу полное решение в этой теме, когда буду завершать проект, конечно, с помощью опыта ребят

Заранее спасибо

РЕДАКТИРОВАТЬ Я внесу больше информации для уточнения моей ситуации

У меня есть пользовательская таблица, таблица отношений и последняя таблица семейных / фамильных деревьев

Таблица семейства должна иметь структуру, аналогичную следующей

ID        userid              relation id             Name

1         34                   3 // for son             ABC
2         34                   4 // for Wife            XYZ
3         34                   3 // for Mom             PQR
4         34                   3 // for DAd             THE
5         34                   3 // for Daughter        GHI
6         34                   3 // for Brother         KLM

Недостатком этого подхода является создание отношений с другими узлами, такими как невестка, жены, брат и их семья.

Идеальный способ сделать это для пользователя, которого мы можем добавить: родители, братья и сестры, дети, а для дополнительных отношений они должны быть получены из отношений членов семьи, т.е. зять должен быть получен как муж сестры или брат жены.

Это то, что я могу думать сейчас. Мне просто нужно руководство по внедрению.

Надеюсь, это поможет вам найти лучшее решение.

1 Ответ

1 голос
/ 09 июня 2011

Я предполагаю, что с точки зрения базы данных было бы лучше реализовать это как

id | name | parent_male | parent_female

Другим вариантом будет префикс строки

id | name | prefix 
1  | Joe  | 0001
2  | Jack | 000100001 //ie. Joes son
3  | Marry| 0001 //ie. Jacks mother
4  | Eve  | 0002 // new family tree
5  | Adam | 00020001 // ie. Eves son
6  | Mark | 000200010001 // ie. Adams son

Другие (более эффективные) алгоритмыподобно MPTT предполагают, что данные являются деревом, которого в этом случае нет (оно имеет круги).

Чтобы показать, что это будет работать - выбрать бабушку и дедушку Марка:

--Mark
SELECT prefix FROM family_tree WHERE id = 6; 
-- create substring - trim N 4-character groups from the end where N is N-th parent generation => 2 for grandparent ==> 0002
--grandparents
SELECT * FROM family_tree WHERE prefix = '0002' 
-- same for other side of family
-- cousins from one side of family
SELECT * FROM family_tree WHERE prefix LIKE '0002%' AND LENGTH(prefix) = 12 
...