Семейное дерево отношений MySQL Store - PullRequest
4 голосов
/ 25 апреля 2011

Мне нужно построить семейное дерево в php и MySQL. Я очень удивлен отсутствием настраиваемого программного обеспечения для построения генеалогических деревьев с открытым исходным кодом, но я отвлекся. Я потратил много времени, читая о хранении орграфов MySQL и генеалогических деревьев. Для меня все имеет смысл: иметь таблицу с узлами (люди) и таблицу с ребрами (отношения).

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

Однако мне также нужно иметь возможность хранить отношения, которые могут не иметь общего родителя, такие как романтические партнеры. Все, что я прочитал, предполагает отношения между родителями и детьми, но поскольку романтические партнеры не имеют общего родителя (надеюсь), я не уверен, как сохранить его в таблице границ. Должен ли я использовать другую таблицу, или что? Если это в той же таблице, как мне это представить? Пока я делаю это с незнакомыми отношениями, я мог бы делать это и с семьей.

Подводя итог, три вопроса:

  • Как мне представить латеральные отношения?
  • Если у боковых отношений есть общий родитель, как мне их сохранить? Должен ли это быть флаг family в таблице, где хранятся другие боковые связи?
  • Как сохранить отношения родитель-потомок, если дочерний элемент находится на расстоянии двух или более ребер (прародителя), но непосредственный родитель недоступен?

Любая помощь приветствуется, и если у кого-нибудь есть какие-либо предложения по созданию программного обеспечения для построения генеалогического дерева javascript / html, это было бы замечательно.

Ответы [ 3 ]

7 голосов
/ 25 апреля 2011

Идея, которая исходит из схемы Geneapro и RootsMagic .

person
------
person_id
name (etc)

life_event_types
----------------
life_event_type_id
life_event_type_description (divorce, marriage, birth, death)

life_events
-----------
life_event_id
life_event_type_id
life_event_description
life_event_date

life_event_roles
----------------
life_event_role_id
life_event_role (mother, father, child)

person_event_role
-----------------
person_id - who
life_event_id - what happened
life_event_role_id - what this person did

Таким образом, вы можете иметь жизненное событие типа "рождение", иrole_id говорит вам, кто был родителями, а кто ребенком.Это может быть распространено на браки, смерти, разводы, приемных родителей, суррогатных родителей (где у вас могут быть 3 или 4 родителя с очень сложными отношениями) и т. Д.

Что касается хранения более отдаленных отношений, вы можете рассчитатьэти.Например, вы можете вычислить Отца любого, получив человека с ролью «отца» с соответствующим идентификатором event_id.Затем вы можете получить отца этого человека, и у вас есть дедушка оригинального человека.Везде, где кто-то неизвестен, создайте человека с неизвестными данными.

1 голос
/ 03 июля 2015

Модель данных GEDCOM и модель данных Gramps являются двумя наиболее популярными форматами для обмена генологическими данными между различными инструментами , Использование любой из этих моделей данных должно как (1) сделать ваш инструмент более совместимым с другими инструментами, так и (2) обеспечить совместимость вашей модели данных со многими особыми случаями, учитывая, что обе модели данных специально разработаны для работы с генологическими данными.

Такие инструменты, как Oxy-Gen или экспортер PHP * Gramps должны помочь вам в том, как импортировать GEDCOM данные в базу данных.

Подробнее см. Также мой ответ на Структура данных «Семейное древо» .

1 голос
/ 25 апреля 2011
person
-------
person_id
other_stuff

relation
----------
person_id_1
person_id_2
relationship_type
begin_dt
end_dt

просто заполните тип отношения любым значением, которое вас интересует. (FK для некоторого списка выбора было бы здорово)

Я поставил даты интересного размышления / провокации мысли.

...