Таблица друзей MySQL

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

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

Ответы

Ответ 1

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

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), чтобы обеспечить доступ всегда эффективны, если мы ищем друзей Джо или друзей Джейн (если вы не настроили второй индекс, тогда первый запрос будет эффективным поиском индекса, а второй потребует полного сканирования таблицы).

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

Ответ 2

Предполагая, что таблица 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;

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

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

Ответ 3

Вы ищете таблицу соединений M-to-N или many-to-many.

Пользователи таблицы:

USER_ID  integer primary key,
NAME     varchar

Таблица Друзей

USER_ID    integer not null,
FRIEND_ID  integer not null,

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

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

Ответ 4

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

Ответ 5

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