我有一个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中所示)。
我的问题:我正在运行一项游戏服务,用户可以将邀请发送给对方玩游戏。我想阻止陌生人发送非朋友邀请。所以我希望能够快速(并且紧凑地)找出向另一个用户发送邀请的用户是否真的是共同的朋友。
由于
答案 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
表中不存在用户名(user
和friend
),则无法将行插入users
表。此外,如果您删除用户,他们所有的友谊都将被删除。与更新的用户名相同(如果您允许)。此外,从那时起,友谊是单向的,而且某个用户只能与另一个用户成为朋友,只需将这两列设为PRIMARY KEY
即可。
然后,查找给定用户的朋友是一个非常简单的查询:
SELECT friend FROM friendships WHERE user='username'