MySQL таблица друзей - PullRequest
       2

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

15 голосов
/ 09 июня 2010

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

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

Ответы [ 5 ]

9 голосов
/ 09 июня 2010

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

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

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

7 голосов
/ 09 июня 2010

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

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

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

1 голос
/ 09 июня 2010

Вы ищете M-N-N или множество-ко-многим объединяющим столам.

Участники таблицы:

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) в таблицу Friendships.

0 голосов
/ 09 июня 2010

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

0 голосов
/ 09 июня 2010

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

...