只是一个非常简单的问题。在我的SQL数据库中,我在表"用户"中有一个名为"friend_count"的列,用于记录登录用户的所有朋友。这与用户id号码,我试图找出如何记录他们所有的工作。下面是我的例子:
USER #29与USER #422成为好友
在user# 29的info列"friend_count"下的用户数据库中,将显示数字"422",如果他与user# 500成为好友,将显示"422,500",以此类推……如果他删除了一个,这个特定的数字就会从盒子中删除。然后,脚本将在用户数据库中搜索这些数字,以显示您的朋友列表。
我该怎么做?什么好主意吗?谢谢!
每当列中有分隔的值列表时,几乎总是表明数据模型不正确。(实际上,我想不出一个例外,但为了安全起见,我将坚持使用"几乎总是"。)
在这种情况下你有两种类型的实体:
- 用户友谊
友谊,虽然不是一个物理对象,但它本身就是一个概念实体。它连接了两个用户,可以添加更多与友谊本身相关的信息,但不一定是两个用户。
你可能有这样的表:
User
--------
ID
Name
etc.
Friendship
--------
ID
OriginatingUser
AcceptingUser
BecameFriendsOn
etc.
所以OriginatingUser
可能是发送好友请求的用户,AcceptingUser
可能是接受请求的用户。BecameFriendsOn
为被接受的日期。您可能希望有状态和其他日期来跟踪待处理请求、拒绝请求等。但所有这些信息都与友谊有关,而不一定与用户有关。
这里你要理解的概念叫做外键。OriginatingUser
和AcceptingUser
列与User
表上的ID
列的数据类型相同。您将创建Friendship
表,使这些列成为User
表的外键,这将强制数据的完整性,以便您不能在没有两个有效且现有的User
记录的情况下创建Friendship
记录。
然后,为了获得好友列表,您将在查询中连接表。也许像这样:
SELECT
User.Name
FROM
Friendship
INNER JOIN User ON Friendship.AcceptingUser = User.ID
WHERE
Friendship.OriginatingUser = ?
当提供原始用户的ID时,这将获得该用户向其发送好友请求的所有用户的名称。您可以在该查询的基础上进一步构建,以获取向同一用户发送好友请求的用户,等等。通过使用表之间的键外键关系(表代表系统中不同类型的实体),您可以构建非常健壮的查询,以多种不同的方式查看数据。
您正在描述两个实体之间的关系,因此您可以创建一个表来存储该关系的详细信息。
假设您的用户表包含一个userid列和其他列。然后,您可以创建一个朋友表,其中两列都是用户表的外键。
friends = (user, friend)
因此,对于用户#29获得的每个好友,需要向好友表中添加一行。例如:
<>之前用户我的名字…29岁的山姆30岁的亨利32岁的简朋友用户的朋友29 3029日32之前Sam是Jane和Henry的朋友,但是Jane和Henry不是朋友
我将创建一个表"friendship",其中包含两个cols "user"answers"friend",然后开始添加用户/朋友id对
users table: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}
一个非常简单的方法,假设如果UserA
和UserB
成为朋友,那么UserB
也会和UserA
成为朋友。
通常不推荐使用逗号分隔列表,因为当列表非常大时,它们会变得很麻烦。更简单的方法是,创建一个包含user_id
和friend_id
列的表friends
,其中user_id和friend_id是各自的userid。
现在,当你想添加一个朋友到某人的列表,使用以下命令:
INSERT INTO users (user_id,friend_id) VALUES(UserA,UserB),(UserB,UserA)
现在,当您执行上面的查询时,您将在friends
表中有2个新行:
user_id friend_id
UserA UserBUserB 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之间的关系,并且它们彼此都不是朋友。