Подтвердить что ты не робот

Схема базы данных дружбы

Я создаю схему db, которая включает в себя пользователей, которые могут быть друзьями, и мне было интересно, как лучше всего смоделировать способность этих друзей дружить. Должна ли она быть собственной таблицей, которая просто имеет два столбца, каждый из которых представляет пользователя? Спасибо!

4b9b3361

Ответ 1

create table 
friendship(
user bigint, 
friend bigint,
primary key(user, friend),
key(friend, user),
constraint `fk_user` foreign key (user) references user(id),
constraint `fk_friend` foreign key (friend) references user(id)
);

Когда пользователь 1 отправляет запрос дружбы пользователю 2, выполните

insert into friendship (user, friend) values (1,2);

Если пользователь 2 отклоняет запрос,

delete from friendship where user = 1 and friend = 2;

если пользователь 2 принимает его:

insert into friendship (user, friend) values (2,1);

Затем дружба может быть найдена следующим образом:

select f1.* 
from friendship f1
inner join friendship f2 on f1.user = f2.friend and f1.friend = f2.user;

Вы можете сделать это с последним запросом, это поможет вам запросить друзей пользователей или даже друзей друзей.

Ответ 2

Я не уверен, что именно так я хотел бы моделировать весь набор. Когда пользователь A отправляет запрос пользователю B, на мой взгляд, создается pending_friendship. Когда пользователь B принимает этот запрос, устанавливается дружба между ними. Обычно это было бы двухсторонним отношением и было бы здорово. Но я хотел бы убедиться, что в будущем есть возможности для отношений в одну сторону. Поэтому я бы смоделировал сценарий, используя две таблицы для отношений и одну таблицу для самого пользователя.

User ( Идентификатор пользователя, Эл. адрес, password_hash, имя, ..., ... )

pending_friendship ( user_id_from, user_id_to )

дружба ( friendship_id, current_user_id, friend_user_id, is_following boolean # Это обеспечило бы область для односторонних отношений. )

Теперь рассмотрим варианты использования -

1- Пользователь A отправляет запрос пользователю B -. Я бы создал запись в таблице pending_friendship. Когда пользователь B хочет увидеть, какие запросы друзей ожидаются, мы можем просто выполнить запрос выбора на основе столбца friend_request_to.

2- Пользователь B принимает запрос друга - Элемент pending_friendship удаляется из таблицы. Две записи сделаны в таблице дружбы для двухсторонних отношений. Оба пользователя будут следовать друг за другом.

3- Пользователь B является другом и не хочет следовать за пользователем. Канал - Столбец is_following имеет значение false для строки дружбы B пользователя пользователя.

4- Пользователь A больше не хочет дружить с B - (В конце концов, B отменил его в случае 3:-)). Идем дальше и удаляем две строки для дружбы между двух пользователей.

Эта схема имеет большую сложность, но добавляет большей ясности. Это также позволяет вам иметь отношения, следующие за пользователем.

Ответ 3

Да (используйте таблицу ссылок n: m).

У вас есть два объекта:

  • пользователь (для данных пользователя, таких как идентификатор, имя, адрес электронной почты и т.д.).
  • (связывает двух пользователей по ID)

создать одну таблицу.