Дерево взаимоотношений с хранилищем MySQL (семейное)

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

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

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

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

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

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

Идея, которая исходит из схемы 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. Затем вы можете получить отца этого человека, и у вас есть дед оригинального человека. В любом случае, если кто-то неизвестен, создайте человека с неизвестными данными.

 person ------- person_id other_stuff relation ---------- person_id_1 person_id_2 relationship_type begin_dt end_dt 

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

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

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

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

Для получения дополнительной информации см. Также мой ответ на структуру данных Family Tree .