2010-06-09 4 views
13

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

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

+2

Являются ли дружба двунаправленной или однонаправленной? Если Пит дружит с Мэри, значит, это всегда означает, что Мэри тоже является другом Пете? –

+0

Также обратите внимание, что имя того, что вам нужно, это «таблица пересечений» или, может быть, «таблица поиска». Если вы знакомы с концепциями баз данных, это много-много таблиц, так как у пользователя может быть много друзей и может быть много друзей с другими людьми. Также обратите внимание, что пользователь может иметь друга, который не является другом, используя этот стиль. Есть и другие способы, но это проще всего реализовать. Может быть, немного больше о вашей дружеской бизнес-логике поможет? @Juha Syrjälä избил меня! – jcolebrand

+0

Друзья являются однонаправленными и должны уже существовать в БД. Это всего лишь список напоминаний о людях, которых вы знаете. – asmo

ответ

9

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

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 

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

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

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

+1

Интересно, как вы формулируете запрос соединения с двумя внешними ключами (userIDLink1 и userIDLink2), указывающими на один и тот же первичный ключ? – koceeng

-1

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

0

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

+0

Итак, для каждого друга каждого пользователя я добавляю строку в таблицу из двух столбцов («Пользователь, друг»). Например, если у меня есть 200 пользователей с 10 друзьями, таблица «Друзья» должна иметь 2000 строк (10 на пользователя). Правильно ли я понимаю? – asmo

+1

@asmo это правильно, но с оптимизированной по индексу таблицей, такой как вы можете иметь в этом случае вы не должны бояться таблиц с более чем миллионом строк - это не будет проблемой. – Cruachan

7

Если предположить, что 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; 

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

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

+0

У меня отсутствует назначение 'FK_FRIENDS_1' там? – jcolebrand

+0

Более чистые с user_id и friend_id – rigobcastro

1

Вы ищете таблицу соединений M-to-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) в таблицу дружеских отношений.

+0

Вы показываете только 2 таблицы? Разве это не один-ко-многим? – Notflip