0

我有一个mysql数据库。我有一张用户表。我想回答“一个用户是另一个用户的朋友吗?”的问题。这些是单向的朋友关系。我想我有两个选择,并且想要更高效的解决方案:

1)保留一张朋友关系表。两列:

username | friend_username
--------------------------
 mary        john
 mary        steve
 mary        kate
 ...

回答友谊问题只需选择两列与用户名 1 和 2 匹配的计数。

2)再次包含两列的表:

username | friends_serialized
-----------------------------
mary       john,steve,kate,

所以“friends_serialized”列包含一个(逗号)分隔的字符串。如果我想知道玛丽是否与某人成为朋友,我可以这样做:

select count from xxx where username="mary" AND friends_serialized LIKE "%,steve,%"

(我不确定语法)。这真的会让我在第一次实施中赢得什么吗?它至少更紧凑,当我需要向用户提供朋友列表时,我可以在单个列中读取它,而不是选择所有匹配的列(如 #1 所示)。

我的问题:我正在运行一项游戏服务,用户可以在其中互相发送邀请来玩游戏。我想防止陌生人发送非朋友邀请。因此,我希望能够快速(紧凑地)查明向另一个用户发送邀请的用户是否实际上是共同的朋友。

谢谢

4

4 回答 4

3

绝对应该采用第一种方法。您的第二种方法甚至违反了关系数据库的第一范式(在单个字段中不存储多个值(在本例中为友谊)。

于 2012-07-14T04:31:58.577 回答
0

你提到的第一个是最好的答案。因为在第二个得到字符串后你必须分析它才能找到关于朋友的,但第一个更直接!

于 2012-07-14T04:31:31.337 回答
0

使用 ID 而不是字符串。

创建联结表:

ID  PersonID FriendID
0    1        2
1    4        2
2    2        3
.....

第 2 个人是第 1 个人和第 4 个人的朋友。第 3 个人是第 2 个人的朋友。

于 2012-07-14T04:31:57.923 回答
0

使用第一个解决方案。创建一个表,例如:

CREATE TABLE friendships (
   user varchar(64) NOT NULL,
   friend varchar(64) NOT NULL,
   PRIMARY KEY (user, friend)
   FOREIGN KEY (user) REFERENCES users (user_name) 
      ON DELETE CASCADE ON UPDATE CASCADE,
   FOREIGN KEY (friend) REFERENCES users (user_name)
      ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

如果您的表中不存在friendships两个用户名(user和) ,这将确保无法将行插入表中。此外,如果您删除一个用户,他们的所有友谊都会被删除。与更新用户名相同(如果您允许)。另外,由于那时友谊是单向的,并且给定的用户只能与另一个用户成为朋友一次,因此将两个列都设为您的.friendusersPRIMARY KEY

然后,查找给定用户的朋友是一个非常简单的查询:

SELECT friend FROM friendships WHERE user='username'

于 2012-07-14T04:38:53.130 回答