1

我正在我的网络应用程序中实现“添加朋友”,因此用户可以将其他用户添加为恶魔。

我们有 2 个表:tbl_userstbl_relations, tbl_users 具有注册用户的唯一 ID, tbl_relations 将存储朋友用户,例如 tbl_relations 中的一些行是:

id     user_id_1     user_id_2
1      4             6
2      4             8
3      8             23
4      12            84
5      3             4
...

在上面的结果中,id 是 tbl_relations 的唯一 id,user_id_1 是 tbl_users 的外键,user_id_2 是 tbl_users 的外键,现在假设我们要查询并检查 id 为“4”的用户是否是 id 用户的朋友“9”与否,这里我们需要以两种方式发送查询,我的意思是:

SELECT * FROM tbl_relations WHERE (user_id_1 = '4' AND user_id_2 = '9') OR (user_id_1 = '9' AND user_id_2 = '4')

上面的查询对我来说似乎有点奇怪,我猜应该有另一种实现方式,也许是不同的数据库结构?

或者另一个查询,我们想获取id 为“4”和“8”的用户之间的共同朋友,在这种情况下我应该如何获得共同朋友?有没有更好的数据库结构呢?

我将不胜感激任何帮助。

4

2 回答 2

2

我会去规范化关系,使其对称。也就是说,如果 1 和 2 是朋友,我将有两行 (1,2) 和 (2,1)。

缺点是它的大小是两倍,并且在建立和破坏友谊时必须进行 2 次写入。优点是您的所有读取查询都更简单。这可能是一个很好的权衡,因为大多数时候你是在阅读而不是写作。

这还有一个额外的好处,如果您最终超出了一个数据库并决定进行用户分片,您不必遍历所有其他数据库分片来找出一个人的朋友是谁。

于 2012-12-18T12:45:10.267 回答
1

如果这样做,则每次更新时都必须检查重复项。为什么没有

user_id1 朋友 ID

然后查询为

select * from tbl_relations where user_id1 in (4,9)

这似乎仍然很奇怪,因为它暗示“朋友”关系是单向的。

为了获得“共同”的朋友——如果你这样做——

select * from tbl_relations t0
join tbl_relations t1 on t0.friend_id = t1.friend_id
where t0.user_id1 = ? 和 t1.user_id1 = ?

于 2012-12-18T12:45:44.527 回答