我处于两难境地,不知道哪一个更好。 (我正在使用php和mysql btw)
让我们说我正在开发一个社交社区网站。用户可以根据需要添加任意数量的朋友。在我的数据库中,我有一个用户表,用于存储用户的详细信息,包括用户的朋友。我应该将用户的朋友存储在:
Strings =>约翰;布莱恩; SAM;保罗; ...;
或
整数=> 1; 21; 50; 1779; 30; ...;
字符串表示存储其用户名。整数表示存储用户ID。
哪一个更好?
如果是字符串,它将是一个非常非常大的字符串(想象用户有400个朋友,有些用户名非常长)
如果是id,如何在用户个人资料页面上列出朋友?获取一个长字符串中的ID列表(以分号分隔),使用explode函数将其转换为数组。然后使用循环显示??不麻烦吗?还有其他方法吗?如果是,请显示一些示例代码..
或者通常,你们如何将“朋友”列表存储在用户表中?
答案 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,您想要列出朋友的用户)