У меня есть MySQL DB, в котором я храню данные о каждом пользователе.
Я хотел бы добавить список друзей для каждого пользователя. Я должен составить таблицу друзей для каждого пользователя в DB или являюсь там лучшим путем?
Предполагая, что все ваши друзья также находятся в таблице 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.
Создать таблицу, содержащую всех друзей. Каждая строка в таблице будет содержать ID пользователя и id его друга
Предполагая, что ваша таблица 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;
Эта установка подтверждает, что Питер - друг Мэри, но Мэри не думает так о Питере. Но данные существуют, чтобы сделать вывод, что Питер является знакомым для Мэри...
Первичный ключ, являющийся обоими столбцами, также останавливает дубликаты.
Создайте единую таблицу для всех друзей и дайте каждому другу UserID, который равен их соответствующему ключу пользователя
Вы ищете таблицу 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.