我应该在php和mysql中存储为“字符串”或“整数”的朋友吗?

时间:2009-02-24 08:15:57

标签: mysql many-to-many

我处于两难境地,不知道哪一个更好。 (我正在使用php和mysql btw)

让我们说我正在开发一个社交社区网站。用户可以根据需要添加任意数量的朋友。在我的数据库中,我有一个用户表,用于存储用户的详细信息,包括用户的朋友。我应该将用户的朋友存储在:

Strings =>约翰;布莱恩; SAM;保罗; ...;

整数=> 1; 21; 50; 1779; 30; ...;

字符串表示存储其用户名。整数表示存储用户ID。

哪一个更好?

如果是字符串,它将是一个非常非常大的字符串(想象用户有400个朋友,有些用户名非常长)

如果是id,如何在用户个人资料页面上列出朋友?获取一个长字符串中的ID列表(以分号分隔),使用explode函数将其转换为数组。然后使用循环显示??不麻烦吗?还有其他方法吗?如果是,请显示一些示例代码..

或者通常,你们如何将“朋友”列表存储在用户表中?

3 个答案:

答案 0 :(得分:8)

不要将它们存储为以分号分隔任何的分号。将它们作为用户ID存储在查找表中。假设用户是#2。你可能有:

SourceUserID | FriendUserID
2              1
2              21
2              50
2              1779
2              30
1              // One of John's friends

然后,要显示朋友列表,您将查询此表,通过SourceUserID = 2限制它,并连接到用户表以获取名称。例如:

SELECT Name FROM SITE_USERS
INNER JOIN USER_FRIENDS ON SITE_USERS.ID = USER_FRIENDS.FriendUserID
WHERE SourceUser = ?

(或者无论您的参数化查询格式是什么;使用您正在显示其页面的用户的ID填充参数。)

答案 1 :(得分:5)

通常你会创建第三个表“users_friends”,它有两列,userId和friendId,它们都构成了主键。一个快速的谷歌想出了这个:http://www.tekstenuitleg.net/en/articles/database_design_tutorial/8,但你可能想查找关于“多对多关系”的其他文章。

答案 2 :(得分:0)

这需要什么称为多对多关系(即朋友可以属于很多用户,用户可以有很多朋友)所以你需要创建第三个表来存储链接,表中会有一个uniqueId,一个朋友ID和用户ID

要获得用户朋友,您需要编写一个连接的SQL语句,即

SELECT Friends.FriendName FROM UserFriends 
   INNER JOIN Friends ON Friends.FriendId = UserFriends.FriendId 
   WHERE UserID = @intUserId 

(@ intUserId,您想要列出朋友的用户)