Php взорваться или уникальная таблица Mysql для друзей пользователя?
Я создам систему дружбы для своего проекта. Я не мог решить, должен ли я хранить друзей в столбце в строке пользователя или создать таблицу друзей и хранить там с идентификаторами пользователей? Чтобы выяснить, какое использование лучше:
Должна ли таблица пользователей быть такой?
+-----------+-----------+---------------+
+ id + username + friends +
+-----------+-----------+---------------+
+ 11 + user_x + 12;23;15;3;7 +
+-----------+-----------+---------------+
с
<?php explode(';',$friends); ?>
или же; Могу ли я создать такую таблицу друзей?
+-----------+-----------+---------------+
+ id + user + friend +
+-----------+-----------+---------------+
+ 1 + 11 + 12 +
+-----------+-----------+---------------+
+ 2 + 11 + 23 +
+-----------+-----------+---------------+
+ 3 + 11 + 15 +
+-----------+-----------+---------------+
+ 4 + 11 + 3 +
+-----------+-----------+---------------+
+ 5 + 11 + 7 +
+-----------+-----------+---------------+
с
SELECT friend FROM friends WHERE user = 11
Какой из них лучше? Спасибо
3 ответа
Второе гораздо более гибкое, например, оно позволяет вам легко запрашивать "людей, которые подружились с вами". Дружелюбие просто включает в себя удаление одной строки, а не манипулирование строкой. Вы можете легко генерировать статистику о количестве друзей и т. Д.
Вы все еще можете добиться эффекта первого варианта, если это важно для вас. Просто используйте GROUP_CONCAT, чтобы получить все идентификаторы друзей в списке, например
SELECT id,foo,bar,GROUP_CONCAT(friend_id) as friends
FROM user
LEFT JOIN friends ON(user.id=friends.user)
GROUP BY user.id;
Последний. Это позволяет вам гораздо больше гибкости.
Представьте себе такие случаи, как удаление друга или подсчет количества друзей, которые у кого-то есть, или просмотр двух людей и просмотр друзей, которых они объединяют. Все тривиально со второй системой, а не с первой.
Это зависит от вашего использования. Если вы только собираетесь отображать список друзей и никогда не искать по нему (например, 14 друг из 11?), То, возможно, первого может быть достаточно. Для удаления или вставки в него потребуется сначала получить список друзей, изменить его, а затем обновить запись со всем новым списком.
Однако, для чего-то большего, чем простое использование, второе гораздо более гибкое, если и пользователь, и друг проиндексированы правильно.