• Как правильно хранить родственные отношения?

    @mayorovp
    Насколько я понимаю, ваша задача - хранение неориентированного графа. Причем основная сложность - в его неориентированности:
    Что-то никак не соображу, как это правильнее сделать - так, чтобы если А родственник Б, то и Б автоматически будет роднёй А.


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

    Альтернативный вариант - списки иницидентности. Тогда в базе будут две таблицы - люди и отношения между ними, а между ними будет таблица-связка, с номером человека и номером отношения.

    Правда, оба варианта выглядят не очень красиво. Но тут у меня есть встречный вопрос - а почему, собственно, отношения родства вдруг стали симметричными? Базовых отношений всего два - "родитель-ребенок" и "супруги". Причем только первое отношение относится к кровному родству - и оно является несимметричным. Второе же отношение, вероятно, рассматривать вообще не стоит - из-за его нехороших свойств (к примеру, оно приводит к нетранзитивности родства - так, бывший муж и текущий муж не являются родственниками). Все остальные родственные отношения однозначно выводятся из базовых.

    Даже если надо хранить любые отношения, а не только базовые (к примеру, в условиях неполноты информации) - большинство отношений родства остаются несимметричными.
    Ответ написан
    1 комментарий
  • Как правильно хранить родственные отношения?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Лучше все-же отдельная табличка с relations, где можно будет перечислить все связи.
    Если хранить все в одной таблице, то или будут указаны не все типы родственных связей, или для каждого типа столбец..?
    Ответ написан
    Комментировать