1

我将为我的项目创建友谊系统。我无法决定是否应该将朋友存储在用户行的列中,还是创建一个朋友表并使用用户 ID 存储在那里?要明确哪种用法更好:

用户表应该是这样的吗?

+-----------+-----------+---------------+
+    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

哪一个更好?谢谢

4

3 回答 3

1

后者。它使您具有更大的灵活性。

想象一下这样的情况,例如删除一个朋友,或者计算某人有多少朋友,或者查看两个人并查看他们有哪些共同的朋友。在第二个系统中,所有这些都是微不足道的,在第一个系统中并非如此。

于 2010-08-12T10:05:46.433 回答
1

第二个更灵活,例如,它使您可以轻松查询“与您成为朋友的人”。解除好友关系只涉及删除单行而不是操作字符串。您可以轻松生成有关人们拥有多少朋友等的统计信息...

如果这对您很重要,您仍然可以实现第一个选项的效果。只需使用 GROUP_CONCAT 来获取列表中的所有朋友 ID,例如

 SELECT id,foo,bar,GROUP_CONCAT(friend_id) as friends 
 FROM user 
 LEFT JOIN friends ON(user.id=friends.user)
 GROUP BY user.id;
于 2010-08-12T10:05:52.753 回答
0

这取决于您的使用情况。如果您只是要显示朋友列表而从不搜索它(例如 14 是 11 的朋友吗?),那么也许第一个可能就足够了。删除或插入它需要首先获取朋友列表,更改它,然后使用整个新列表更新记录。

然而,除了这个简单的用法之外,第二个更灵活,只要用户和朋友都被正确索引。

于 2010-08-12T10:08:01.670 回答