Представление родственных связей (генеалогического дерева) в виде графа

Прочитал статью Фамильный вики-движок Bonsai: 6 лет спустя и вспомнил что в своё время были планы сделать что-то подобное. После того как я попробовал использовать некоторые существующие решения (особенно одно в котором предлагалось при добавлении человека указать кем он является по отношению к другим и список на 100500 позиций вида сын, дочь, мама, папа, дедушка и т.д. и т.п.) была разработана собственная схема хранения родственных связей в виде графа. В качестве вершин графа выступают люди, а в качестве ребер отношения между людьми. При этом типов отношений всего два:


  1. Родитель→Ребенок (связь имеет направление от родителя к ребенку)
  2. Брачный союз (связь равноправна и не имеет направления)
    С помощью отношений этих двух видов возможно задать родство любой сложности.
    xnhh5a5z-hzl-utnfrqysjoqxzo.png


Отношения (связи) — ребра графа

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

Связь вида Родитель→Ребенок разделяется на три вида:


  1. Кровное родство т.е. именно эти люди являются биологическими родителями. При этом даже если это просто донор спермы в банке спермы, то этот человек будет являться биологическим отцом. Хотя в этом случае его «отцовство» фактически начнется и закончится ещё до рождения ребенка.
  2. Усыновление/удочерение т.е. институт приемных родителей. К примеру на схеме Вася усыновил дочь Катю своей жены Маши которую она родила от Пети в первом браке. Вася является отчимом Кати, а Маша является её родной матерью.
  3. Резервные родители т.е. крестные. Честно говоря не особо понятно насколько это актуально в нынешних условиях потому что времена нынче не те. Но вроде термин этот в ходу, поэтому заложил в схему. В силу того что у меня крестного нет, я об этом мало знаю. Т.е. может ли крестный отказаться или нет. Но если такой вариант отсутствует, то достаточно не заполнять дату окончания.

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

В схеме не указывается явно что кто-то кому то является бабушкой/внуком/дядей и т.д. и т.п. Это следует из самой схемы. К примеру Валера внук Васе, а Вася дед Валере. Маша является свекровью для Дианы, а Диана невесткой для Маши. Для Ивана Маша теща, а Вася — тесть.


Люди — вершины графа

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


Атрибуты человека


  • Дата рождения — не зависит от времени
  • Дата смерти — не зависит от времени
  • Фамилия
  • Имя
  • Отчество
  • Пол — на схеме мальчики синие кружочки, девочки — розовые. Т.е. подразумевается что пол может быть либо мужской, либо женский. Всё остальное — в отдельный атрибут
  • Фото
  • Место проживания, город

  • Список расширяемый, так что его всегда можно расширить на нужные значения


Пример

И теперь на основе всего выше написанного расшифруем схему:
Маша и Петя заключили брак. У них родилась Катя. Затем они развелись. Маша вышла замуж за Васю У них родился Игорь, которому они крестными взяли Олега и Иру. Затем Катя вышла замуж за Ивана, а Игорь женился на Диане и у них родился сын Валера.
К сожалению крестный Игоря Олег умер.
xnhh5a5z-hzl-utnfrqysjoqxzo.png


Заключение

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

Может когда-нибудь, как и у автора Bonsai, и у меня дойдут руки сделать что-то подобное, но со своим блэкджеком и схемой.

© Habrahabr.ru