我正在我的网络应用中实施“添加朋友”,因此用户可以将其他用户添加为恶魔。
我们有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”的用户之间获得共同的朋友,在这种情况下我应该如何得到共同的朋友?有没有更好的数据库结构呢?
我会感激任何帮助。
答案 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 =?