Друзья MySQL таблица

У меня есть MySQL DB, в котором я храню данные о каждом пользователе.

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

15
задан OMG Ponies 9 June 2010 в 19:42
поделиться

5 ответов

Предполагая, что все ваши друзья также находятся в таблице user, вам понадобится таблица friends, которая определяет простое отношение один-ко-многим - связывая таблицу users обратно с самой собой. Итак

User Table
UserID int identity not null
[other attribute fields]

Friends Table
UserIDLink1 int
UserIDLink2 int 
[other attribute field]

Где UserIDLink1 и UserIDLink2 являются внешними ключами таблицы Users.

Например, если у меня три пользователя

1 Joe
2 Bill
3 Jane

и Джо и Джейн являются друзьями, то таблица Friends будет содержать одну строку

1 3

Вышеприведенное неявно предполагает, что если A является другом B, то B является другом A - если это не так, то вы, вероятно, захотите переименовать UserIDLink1 и UserIDLink2 в UserID и FriendID или что-то подобное - в этом случае у вас также будет вдвое больше записей.

Также для двунаправленной конфигурации (A является другом B, если B является другом A) вы должны установить индексы в таблице Friends для (UserIDLink1,UserIDLink2) и (UserIDLink2,UserIDLink1), чтобы обеспечить эффективный доступ, если мы будем искать друзей Джо или друзей Джейн (если вы не установили второй индекс, то первый запрос будет эффективным поиском по индексу, но второй потребует полного сканирования таблицы).

Если бы ваши связи не были двунаправленными, это не было бы необходимо, чтобы узнать, кто является друзьями A, но вы все равно, вероятно, будете нуждаться в этом, поскольку вам, вероятно, также потребуется узнать, кто является другом B.

10
ответ дан 1 December 2019 в 04:09
поделиться

Создать таблицу, содержащую всех друзей. Каждая строка в таблице будет содержать ID пользователя и id его друга

0
ответ дан 1 December 2019 в 04:09
поделиться

Предполагая, что ваша таблица USER имеет первичный ключ id или что-то подобное, используйте следующую таблицу:

DROP TABLE IF EXISTS `friends`;
CREATE TABLE `friends` (
  `user_id` int(10) unsigned NOT NULL,
  `friend_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`user_id`,`friend_id`),
  KEY `FK_FRIENDS_2` (`friend_id`),
  CONSTRAINT `FK_FRIENDS_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
  CONSTRAINT `FK_FRIENDS_2` FOREIGN KEY (`friend_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Эта установка подтверждает, что Питер - друг Мэри, но Мэри не думает так о Питере. Но данные существуют, чтобы сделать вывод, что Питер является знакомым для Мэри...

Первичный ключ, являющийся обоими столбцами, также останавливает дубликаты.

7
ответ дан 1 December 2019 в 04:09
поделиться

Создайте единую таблицу для всех друзей и дайте каждому другу UserID, который равен их соответствующему ключу пользователя

-1
ответ дан 1 December 2019 в 04:09
поделиться

Вы ищете таблицу M-to-N или many-to-many join.

Таблица Users:

USER_ID  integer primary key,
NAME     varchar

Таблица Friendships

USER_ID    integer not null,
FRIEND_ID  integer not null,

Оба USER_ID и FRIEND_ID являются внешними ключами, которые ссылаются на таблицу Users (Users.user_id).

Если пользователь 123 является другом пользователя 921. Добавьте строку (123, 921) в таблицу Friendships.

1
ответ дан 1 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: