MySQL-双向查询检查

MySQL-双向查询检查,mysql,database-design,Mysql,Database Design,我正在我的web应用程序中实现添加好友,这样用户就可以添加其他用户作为好友 我们有两个表:tbl_用户和tbl_关系,tbl_用户有注册用户的唯一ID,tbl_关系将存储朋友用户,例如tbl_关系中的某些行: id user_id_1 user_id_2 1 4 6 2 4 8 3 8 23 4 12 84 5 3

我正在我的web应用程序中实现添加好友,这样用户就可以添加其他用户作为好友

我们有两个表:tbl_用户和tbl_关系,tbl_用户有注册用户的唯一ID,tbl_关系将存储朋友用户,例如tbl_关系中的某些行:

id     user_id_1     user_id_2
1      4             6
2      4             8
3      8             23
4      12            84
5      3             4
...
在上面的结果中,id是tbl_关系的唯一id,user_id_1是tbl_用户的外键,user_id_2是tbl_用户的外键,现在假设我们想要查询并检查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的用户之间的共同好友,在这个场景中我应该如何获得共同好友?有没有更好的数据库结构


我将非常感谢任何帮助。

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

缺点是它的大小是它的两倍,在建立和破坏友谊时,你必须写两封信。优点是所有的读取查询都更简单。这可能是一个很好的折衷方案,因为大部分时间你都在阅读而不是写作


这样做的另一个好处是,如果您最终超过一个数据库并决定进行用户分片,则不必遍历其他每个数据库分片来找出一个人的朋友。

如果这样做,则每次更新时都必须检查重复的数据库分片。为什么不呢

用户\u id 1朋友\u id

然后查询为

从tbl_关系中选择*,其中用户_id1位于4,9中

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

如果你这样做的话,就可以得到“共同的”朋友-

从tbl_关系t0中选择* 在t0.friend\u id=t1.friend\u id上加入tbl\u关系t1 其中t0.user_id1=?和t1.user_id1=


其他大公司就是这样实施的吗?我是说Facebook,G+,链接在…,我不这么认为!共同的朋友呢?thanksFacebook是这样实现的,尽管大多数操作都不是在db服务器上完成的,因为它不能扩展。可以通过将两个用户的好友行相交来实现共同好友。如果你想把它作为一个单一的查询:在a.user\u id\u 2=b.user\u id\u 2上选择*FROM tbl\u relations作为一个内部连接tbl\u relations作为b,其中a.user\u id\u 1='4'和b.user\u id\u 1='9'。我不明白这个答案是如何解决双向检查的,你能解释一下吗?thanksIt正在查询具有相同好友的两个用户ID。其格式为“准备好的语句”。查询select*from tbl_relations,其中4,9中的user_id1错误,这将返回user_id1=4或user_id1=9的所有记录,显然,这无法确定两个用户是否是朋友!如果关系是双向的,就不会。当然,朋友之间的关系是双向的,而A是B的朋友,所以B是A的朋友,但我们无法通过您建议的查询检查A和B是否是朋友,请进一步解释。谢谢