Структура данных для генеалогического древа с несколькими партнерами и братьями и сестрами?

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

Основой всего дерева является человек, создающий дерево.

Рассмотрим эту очень простую структуру:

{
    "name": "Me",
    "dob": "1988",
    "parents": [
        {
            "name": "Gina Carano",
            "dob": "1967"
        },
        {
            "name": "Genghis Khan",
            "dob": "1961"
        }
    ],
    "children": [
        {
            "name": "Tim",
            "dob": "1992"
        }
    ]
}

Это прекрасно работает, но что, если я обнаружу, что у меня есть сводная сестра по имени Джуди (Чингисхан любил женщин) и полнородный брат по имени Брайан, и расширим это до этого?

{
    "name": "Me",
    "dob": "1988",
    "parents": [
        {
            "name": "Gina Carano",
            "dob": "1967"
        },
        {
            "name": "Genghis Khan",
            "dob": "1961"
        }
    ],
    "children": [
        {
            "name": "Tim",
            "dob": "1992"
        }
    ],
    "siblings": [
        {
            "name": "Judy",
            "dob": "1987",
            "parents": [
                {
                    "name": "Courtney Carano",
                    "dob": "1965"
                },
                {
                    "name": "Genghis Khan",
                    "dob": "1961"
                }
            ]
        },
        {
            "name": "Brian",
            "dob": "1988",
            "parents": [
                {
                    "name": "Gina Carano",
                    "dob": "1967"
                },
                {
                    "name": "Genghis Khan",
                    "dob": "1961"
                }
            ]
        }
    ]
}

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

[
    { "id": "1", "name": "Me", "dob": "1988", "parents": [2,3], "siblings": [4,5] },
    { "id": "2", "name": "Genghis Khan", "dob": "1961", "children": [1,4,5] },
    { "id": "3", "name": "Gina Carano", "dob": "1967", "children": [1] },
    { "id": "4", "name": "Tim", "dob": "1992", "parents" : [2,3] },
    { "id": "5", "name": "Judy", "dob": "1987", "parents": [2,6] },
    { "id": "6", "name": "Courtney Carano", "dob": "1965", "children": [5] }
]

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

Примечание. Я полагаю, что если я оставлю исходную структуру, мне придется добавить ключи идентификатора, чтобы правильно определить, что Чингисхан один и тот же во всех трех экземплярах.

Моей конечной целью является отображение родословного дерева (вероятно, в d3.js), которое визуально будет выглядеть следующим образом: с чертой посередине между партнерами, ведущими к своим детям.

Итак, с набором данных выше я пытаюсь отобразить:

введите здесь описание изображения


person meder omuraliev    schedule 02.12.2015    source источник
comment
Вы уже показали, что у него меньше избыточности. Я не вижу никаких ограничений в этом формате, если только вы не говорите об очень больших деревьях, где количество братьев и сестер становится слишком большим, чтобы быть представленным в Javascript. Но раньше у тебя кончилась память.   -  person Lars Kotthoff    schedule 02.12.2015
comment
@LarsKotthoff - я просто подумал, что первую структуру может быть проще разобрать с помощью d3.js - есть мысли по этому поводу? Если это так, я мог бы создать первую структуру из второй. Хотя, наверное, переосмыслил это.   -  person meder omuraliev    schedule 02.12.2015
comment
Да, для D3 потребуется расширенная структура, но преобразование последней в первую должно быть тривиальным (именно так работают многие примеры принудительного макета; они обрабатывают необработанные данные перед помещением их в принудительный макет).   -  person Lars Kotthoff    schedule 02.12.2015
comment
@meder немного сбит с толку, когда вы говорите _ определите, что Чингисхан один и тот же во всех трех случаях_ как будет выглядеть визуализация, поскольку у Чингисхана (поскольку вы хотите показать Чингисхана в одном узле) было несколько жен. Другой случай: у Чингисхана есть дочерний узел 1, то есть узел я... У Джины Карано также есть дочерний узел 1, то есть у меня, и у Кортни Карано также есть дочерний узел 1, то есть у меня... как это возможно.....правилен ли набор данных .   -  person Cyril Cherian    schedule 03.12.2015
comment
@Кирилл - Извини. Дочерний узел Кортни Карано должен быть 5 (Джуди). Попытка заставить дерево отображаться следующим образом: i.imgur.com/7qpslYb.png. Графическая часть пользовательского интерфейса должна выглядеть так же, как на familyecho.com.   -  person meder omuraliev    schedule 03.12.2015


Ответы (1)


Почти во всех генеалогических системах есть идентификаторы людей, поэтому я бы не стал беспокоиться об этом.

Традиционный способ сделать это — иметь тип узла Family, а также тип узла Person. Это позволяет заключать несколько браков, а также дает вам место для подключения информации, такой как дата брака, место бракосочетания и т. д.

person[ { "id": "p1", "name": "Me", "dob": "1988", "parents": "f3" }, { "id": "p2", "name": "Genghis Khan", "dob": "1961", "parents": "f1", "spouse_families": ["f2", "f3"] }, { "id": "p3", "name": "Gina Carano", "dob": "1967", "spouse_families" : ["f3"] }, { "id": "p4", "name": "Brian", "dob": "1992", "parents" : "f3" }, { "id": "p5", "name": "Judy", "dob": "1987", "parents": "f2" }, { "id": "p6", "name": "Courtney Carano", "dob": "1965", "spouse_families": ["f2"] }, {"id": "p7", "name": "Mother of Ghengis"}, {"id": "p8", "name": "Father of Ghengis"}, ]

family[ {"id":"f1","marriage date":"", "parents": ["p7", "p8"],"children":["p2"]}, {"id":"f2","marriage date":"", "parents": ["p6", "p2"],"children":["p5"]}, {"id":"f3","marriage date":"", "parents": ["p3","p2"],"children":["p1", "p4"]}, ]

Это дает вам место для соединения всех родителей и детей без избыточности и большого количества специальных корпусов. (Примечание: я исправил «Тим» на «Брайан» в структуре данных, чтобы она соответствовала графике.)

person Tom Morris    schedule 04.01.2016