这是一个非常简单的问题。在我的SQL数据库中,我有一个名为" friend_count"的列。在表格#34;用户"记录登录用户拥有的所有朋友。这适用于UserID号码,我试图弄清楚如何记录它们。这是我的榜样:
USER#29成为USER#422的朋友
在" friend_count"列中的USER#29信息下的用户数据库中然后将有#34; 422",如果他随后成为用户#500的朋友,它将显示" 422,500"等等......如果他删除了一个,那么该特定号码就会被删除。然后,该脚本将通过用户数据库搜索这些数字,以显示您与朋友在一起的人员列表。
我该怎么做?有任何想法吗?谢谢!
答案 0 :(得分:3)
每当您在列中有一个分隔的值列表时,几乎总是表示数据模型不正确。 (实际上,我不能想到这个例外,但我会坚持“几乎总是”只是为了安全。)
在这种情况下,您有两种类型的实体:
友谊虽然不是物理对象,但它本身就是一个概念实体。它连接两个用户,可以添加更多与友谊本身相关的信息,但不一定是两个用户。
所以你可能有这样的表:
User
--------
ID
Name
etc.
Friendship
--------
ID
OriginatingUser
AcceptingUser
BecameFriendsOn
etc.
因此OriginatingUser
可能是发送好友请求的用户,AcceptingUser
可能是接受好友请求的用户。 BecameFriendsOn
是被接受的日期。您可能希望有状态和其他日期来跟踪待处理请求,拒绝请求等。但所有这些信息都与友情有关,而不一定与用户有关。
您希望在此理解的概念称为外键。 OriginatingUser
和AcceptingUser
列与ID
表中的User
列的数据类型相同。您将创建Friendship
表,以使这些列是User
表的外键,这会强制数据的完整性,这样您就无法创建Friendship
记录而没有两个有效和现有的User
条记录。
然后,要获取朋友列表,您将在查询中加入表。也许是这样的:
SELECT
User.Name
FROM
Friendship
INNER JOIN User ON Friendship.AcceptingUser = User.ID
WHERE
Friendship.OriginatingUser = ?
当提供原始用户的ID时,这将获得该用户向其发送朋友请求的所有用户名。您可以进一步构建查询,以便向同一用户发送朋友请求的用户,等等。通过利用表示系统中不同类型实体的表之间的关键外键关系,您可以构建非常健壮的查询,以便以多种不同方式查看数据。
答案 1 :(得分:0)
您正在描述两个实体之间的关系,因此您可以创建一个表来存储该关系的详细信息。
假设您的用户表包含userid列和其他列。然后,您可以创建一个包含两列的friends表,这两列都是用户表的外键。
friends = (user, friend)
因此,对于用户#29获得的每个朋友,您需要在friends表中添加一行。例如:
USER ID NAME ... 29 Sam 30 Henry 32 Jane Friends user friend 29 30 29 32山姆是简和亨利的朋友,但简和亨利不是朋友。
答案 2 :(得分:0)
我会用两个cols“user”和“friend”创建一个表“友谊”,然后你开始添加一对用户/朋友ID
答案 3 :(得分:0)
用户表 id,用户名,其他
朋友表: relationship_id,user_id,user_friend_id
示例查询以获取属于用户朋友的ID列表:
SELECT f.user_friend_id FROM users u
LEFT JOIN friends f ON f.user_id = u.id
WHERE u.id = {$user_id}
答案 4 :(得分:0)
一种非常简单的方法,假设如果UserA
成为UserB
的朋友,那么UserB
也会成为UserA
的朋友。
通常,不建议使用逗号分隔列表,因为当列表非常大时,它们会变得很痛苦。一种更简单的方法是,使用列friends
和user_id
制作表friend_id
,其中user_id和friend_id是相应的UserID。
现在,当您想将朋友添加到某人的列表中时,请使用以下内容:
INSERT INTO users (user_id,friend_id) VALUES(UserA,UserB),(UserB,UserA)
现在,当您执行上述查询时,friends
表中将有2个新行:
user_id friend_id
UserA UserB UserB UserA
如果您想获取用户朋友的列表,请使用:
SELECT friend_id FROM friends WHERE user_id=(Your user's ID)
这将逐个返回一行,因此会为您提供特定用户的所有朋友ID。
现在,如果要删除朋友,请使用:
DELETE FROM friends WHERE (user_id,friend_id) IN ((user_id,friend_id),(friend_id,user_id))
这将删除表中的两行,这意味着UserA和UserB之间的关系被删除,并且它们都不是彼此的朋友。