Как вы моделируете типичные отношения друг-друга в реляционной базе данных? - PullRequest
0 голосов
/ 28 января 2020

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

отношения друг-друг

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

Моя лучшая, но не удовлетворительная, идея до сих пор

  • Таблица, содержащая людей
  • Таблица, содержащая отношения
  • Таблица, содержащая отношения «многие ко многим» между людьми и отношениями

Как и в изображение ниже.

предлагаемая модель данных

Это выглядит нормально с точки зрения моделирования данных, но при написании запроса SQL, который проверяет, являются ли два заданных person_ids друзья или нет, запрос становится довольно сложным, что заставляет меня думать, что это неправильный способ сделать это.

Ответы [ 3 ]

0 голосов
/ 28 января 2020

Я бы go для таблицы ссылок [Друг - Друг - Отношения].

[Friend]---[Link_table]---[Relationship]
                 |
              [Friend]

:) РЕДАКТИРОВАТЬ:

Где, например, [Таблица] : столбцы ...

  • [Друг]: PK_Friend, Имя, Фамилия
  • [Ссылка]: PK_Link, PK_Friend1, PK_Friend2, PK_RelationShip
  • [RelationShip]: PK_RelationShip, RelationShipDescription
0 голосов
/ 07 февраля 2020
create table individuals (
  individual_id int primary key,
  full_name varchar(255)
);

create table relationships (
  from_individual_id int references individuals(individual_id),
  type varchar(255) check (type in ('FRIEND OF')), -- should be a lookup table
  to_individual_id int references individuals(individual_id),

  primary key (from_individual_id, to_individual_id, type),
  check (from_individual_id <> to_individual_id)
);

Я могу думать, что ты мой друг, но ты не думаешь, что я твой друг ...

Но обычно "от" думает "до" это друг и наоборот так что вы добавите обратную связь в виде еще одной строки

0 голосов
/ 28 января 2020

Я бы порекомендовал таблицу с двумя столбцами person_id и, возможно, ID типа отношения для разных отношений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...