存储单向朋友关系的紧凑方式?

时间:2012-07-14 04:27:12

标签: mysql sql database-design

我有一个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 个答案:

答案 0 :(得分:3)

你应该绝对采用第一种方法。你的第二种方法甚至违反了关系数据库的第一范式(不是在一个字段中存储多个值(在这种情况下是友谊)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

使用ID而不是字符串。

创建联结表:

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

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

答案 3 :(得分: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表中不存在用户名(userfriend),则无法将行插入users表。此外,如果您删除用户,他们所有的友谊都将被删除。与更新的用户名相同(如果您允许)。此外,从那时起,友谊是单向的,而且某个用户只能与另一个用户成为朋友,只需将这两列设为PRIMARY KEY即可。

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

SELECT friend FROM friendships WHERE user='username'