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

Товарищи дорогие, разверните меня, пожалуйста, в правильном направлении и дайте хорошего пинка. Ситуация: есть база, в ней таблица, каждая запись - информация по одному человеку (первичный ключ - id). Необходимо пройти по ней, выявить и сохранить родственников. Критерии отбора определены, вопрос только про сохранение связей между записями одной таблицы. Что-то никак не соображу, как это правильнее сделать - так, чтобы если А родственник Б, то и Б автоматически будет роднёй А. По идее, мы здесь ведём речь о графах? Может быть, эти связи тогда вообще не в реляционной БД хранить? Буду благодарен за любой совет (в том числе RTFM, если будет ссылка на FM). Всем бобра.
  • Вопрос задан
  • 3012 просмотров
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev Куратор тега Программирование
software engineer
Лучше все-же отдельная табличка с relations, где можно будет перечислить все связи.
Если хранить все в одной таблице, то или будут указаны не все типы родственных связей, или для каждого типа столбец..?
Ответ написан
Комментировать
@mayorovp
Насколько я понимаю, ваша задача - хранение неориентированного графа. Причем основная сложность - в его неориентированности:
Что-то никак не соображу, как это правильнее сделать - так, чтобы если А родственник Б, то и Б автоматически будет роднёй А.


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

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

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

Даже если надо хранить любые отношения, а не только базовые (к примеру, в условиях неполноты информации) - большинство отношений родства остаются несимметричными.
Ответ написан
zo0m
@zo0m
full stack developer
добавьте в табличку колонку: parent_id в котором будет сохранен id родителя.

я такие штуки иерархическими запросами обрабатывал (использовал Oracle)
docs.oracle.com/cd/B19306_01/server.102/b14200/que...

но можно и более обычными инструментами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы