Как обычно, «это зависит».
Первый вопрос: «Как вы будете использовать эти данные?». Какие вопросы вы ожидаете от базы данных? Если вы хотите показать профиль человека с его отношениями, это довольно просто. Если вы хотите узнать, сколько у человека детей, или кто является дедушкой человека, или возраст чьего-то младшего ребенка, это может быть немного сложнее.
Второй вопрос: "Насколько вы уверены, что это единственные отношения, которые вы хотите сохранить?" Возможно, вы также хотите сохранить «сосед», «член команды», «busy_to» - или, возможно, вам нужно сохранить эту информацию позже. Может быть, вам нужно принять во внимание развод людей или повторный брак.
Предлагаемая схема отлично работает для большинства сценариев, но добавление нового типа отношений означает, что вам нужно добавить новый столбец. Не существует жестких и быстрых правил, но в целом лучше добавлять строки, чем столбцы, когда они сталкиваются с событиями в проблемной области. Для того, чтобы спросить «кто является дедушкой этого человека», требуется пара самостоятельных присоединений, и это нормально.
@ ba3a предлагает отделить информацию о людях от информации об отношениях. Это намного «чище» - и с меньшей вероятностью потребует новых столбцов, поскольку вы сохраняете больше типов отношений. Для отображения профиля человека требуется запрос с большим количеством внешних объединений. Чтобы найти прародителя, требуются самостоятельные объединения в таблице «отношений».