1

我进退两难,不知道哪个更好。(我正在使用 php 和 mysql 顺便说一句)

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

字符串 => john;bryan;sam;paul;...;

或者

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

字符串意味着存储他们的用户名。整数表示存储他们的用户 ID。

哪一个更好?

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

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

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

4

3 回答 3

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 填充参数。)

于 2009-02-24T08:22:05.200 回答
5

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

于 2009-02-24T08:20:42.567 回答
0

这需要所谓的多对多关系(即一个朋友可以属于多个用户,用户可以有很多朋友)所以您需要创建第三个表来存储链接,该表将有一个 uniqueId、一个朋友 ID 和一个用户身份,

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

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

(您要为其列出朋友的用户的@intUserId)

于 2009-02-24T08:27:34.233 回答