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?), То, возможно, первого может быть достаточно. Для удаления или вставки в него потребуется сначала получить список друзей, изменить его, а затем обновить запись со всем новым списком.

Однако, для чего-то большего, чем простое использование, второе гораздо более гибкое, если и пользователь, и друг проиндексированы правильно.

Другие вопросы по тегам