Прочитал статью Фамильный вики-движок Bonsai: 6 лет спустя и вспомнил что в своё время были планы сделать что-то подобное. После того как я попробовал использовать некоторые существующие решения (особенно одно в котором предлагалось при добавлении человека указать кем он является по отношению к другим и список на 100500 позиций вида сын, дочь, мама, папа, дедушка и т.д. и т.п. ) была разработана собственная схема хранения родственных связей в виде графа. В качестве вершин графа выступают люди, а в качестве ребер отношения между людьми. При этом типов отношений всего два:
- Родитель->Ребенок (связь имеет направление от родителя к ребенку)
- Брачный союз (связь равноправна и не имеет направления)
С помощью отношений этих двух видов возможно задать родство любой сложности.
Отношения (связи) — ребра графа
Каждая связь (отношение) имеет дату и время начала и окончания действия. Браки заключаются и расторгаются, а родители отказываются от детей. Поэтому каждая связь может иметь два состояния: активное (на схеме неразрывная линия) и неактивное (на схеме пунктирная линия). Если текущая дата входит в интервал начала и конца отношения (или конец действия не указан), то связь активная.
Связь вида Родитель->Ребенок разделяется на три вида:
Кровное родство
т.е. именно эти люди являются биологическими родителями. При этом даже если это просто донор спермы в банке спермы, то этот человек будет являться биологическим отцом. Хотя в этом случае его "отцовство" фактически начнется и закончится ещё до рождения ребенка.Усыновление/удочерение
т.е. институт приемных родителей. К примеру на схеме Вася усыновил дочь Катю своей жены Маши которую она родила от Пети в первом браке. Вася является отчимом Кати, а Маша является её родной матерью.Резервные родители
т.е. крестные. Честно говоря не особо понятно насколько это актуально в нынешних условиях потому что времена нынче не те. Но вроде термин этот в ходу, поэтому заложил в схему. В силу того что у меня крестного нет, я об этом мало знаю. Т.е. может ли крестный отказаться или нет. Но если такой вариант отсутствует, то достаточно не заполнять дату окончания.
Между двумя вершинами (людьми) может быть несколько связей. К примеру заключили брак, разошлись, потом подумали и опять вступили в брак.
В схеме не указывается явно что кто-то кому то является бабушкой/внуком/дядей и т.д. и т.п. Это следует из самой схемы. К примеру Валера внук Васе, а Вася дед Валере. Маша является свекровью для Дианы, а Диана невесткой для Маши. Для Ивана Маша теща, а Вася — тесть.
Люди — вершины графа
Вся информация о человеке хранится в вершине графа. Практически все характеристики (атрибуты) человека зависят от даты ( даже его пол, время такое :) ). Т.е. человек задаётся списком атрибутов и у каждого атрибута имеется время начала действия. К примеру фамилия, которую женщина может сменить после замужества. Место проживания тоже зависит от времени. Есть только два атрибута, которые не зависят от времени, потому что они сами являются временем — дата рождения и дата смерти. Вершина также может быть в двух состояниях: жив и мертв.
Атрибуты человека
Дата рождения
— не зависит от времениДата смерти
— не зависит от времениФамилия
Имя
Отчество
Пол
— на схеме мальчики синие кружочки, девочки — розовые. Т.е. подразумевается что пол может быть либо мужской, либо женский. Всё остальное — в отдельный атрибутФото
Место проживания, город
- …
Список расширяемый, так что его всегда можно расширить на нужные значения
Пример
И теперь на основе всего выше написанного расшифруем схему:
Маша и Петя заключили брак. У них родилась Катя. Затем они развелись. Маша вышла замуж за Васю У них родился Игорь, которому они крестными взяли Олега и Иру. Затем Катя вышла замуж за Ивана, а Игорь женился на Диане и у них родился сын Валера.
К сожалению крестный Игоря Олег умер.
Заключение
Схема позволяет хранить любые родственные связи, даже аморальные и незаконные + имеет расширяемый набор атрибутов. Если к кого-то есть пример, что не может быть описан данной схемой, пишите, подумаем как это исправить.
Может когда-нибудь, как и у автора Bonsai, и у меня дойдут руки сделать что-то подобное, но со своим блэкджеком и схемой.