Я создаю схему db, которая включает в себя пользователей, которые могут быть друзьями, и мне было интересно, как лучше всего смоделировать способность этих друзей дружить. Должна ли она быть собственной таблицей, которая просто имеет два столбца, каждый из которых представляет пользователя? Спасибо!
Схема базы данных дружбы
Ответ 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)
создать одну таблицу.