use*_*957 6 mysql database-design structure
很多人说我应该创建一个友谊表(userid , friendid).
我的问题是:
每个友谊都不会有双重记录吗? 喜欢:
12是5
+
5的朋友是12的朋友
有办法防止这种情况吗?
| 或者 |
我应该忽略它吗?
您可以使用至少两种方法:
userid始终小于friendid.第二种方法的存储成本是存储的两倍,并且是多余的,但它确实意味着某些查询可以更简单并且性能更好.例如,考虑使用每种方法获取用户'a'和'b'的所有常见朋友:
方法1:
SELECT friendid
FROM
(
SELECT friendid FROM friendships WHERE userid = 'a'
UNION
SELECT userid FROM friendships WHERE friendid = 'a'
) T1
JOIN
(
SELECT friendid FROM friendships WHERE userid = 'b'
UNION
SELECT userid FROM friendships WHERE friendid = 'b'
) T2
ON T1.friendid = T2.friendid
Run Code Online (Sandbox Code Playgroud)
方法2:
SELECT T1.friendid
FROM friendships T1
JOIN friendships T2
ON T2.userid = 'b' AND T1.friendid = T2.friendid
WHERE T1.userid = 'a'
Run Code Online (Sandbox Code Playgroud)