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

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

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

5 ответов


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

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

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

1 3

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

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

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


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

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

первичного ключа обе колонки останавливается дубликаты.


вы ищете M-to-N или много-ко-многим присоединиться к таблице.

Таблица Users:

USER_ID  integer primary key,
NAME     varchar

Таблица Дружбу

USER_ID    integer not null,
FRIEND_ID  integer not null,

и USER_ID и FRIEND_ID являются внешними ключами, которые ссылаются на таблицу пользователей (Users.идентификатор пользователя.)

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


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


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