MySQL - 2路查询检查

时间:2012-12-18 12:40:34

标签: mysql database-design

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

我们有2个表: tbl_users tbl_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”的用户之间获得共同的朋友,在这种情况下我应该如何得到共同的朋友?有没有更好的数据库结构呢?

我会感激任何帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

  

user_id1 friend_id

然后查询为

  

从tbl_relations中选择*,其中user_id1位于(4,9)

这似乎很奇怪,这意味着“朋友”关系是单向的。

要获得'共同'的朋友 - 如果你这样做 -

  

从tbl_relations t0选择*       在t0.friend_id = t1.friend_id上加入tbl_relations t1       其中t0.user_id1 =?和t1.user_id1 =?