MySQL结构::友谊

use*_*957 6 mysql database-design structure

很多人说我应该创建一个友谊表(userid , friendid).

我的问题是:

每个友谊都不会有双重记录吗? 喜欢:
125
+
5的朋友是12的朋友

有办法防止这种情况吗?

| 或者 |

我应该忽略它吗?

Mar*_*ers 6

您可以使用至少两种方法:

  1. 确保userid始终小于friendid.
  2. 将每个关系存储在两个方向上(即存储a,b和b,a).

第二种方法的存储成本是存储的两倍,并且是多余的,但它确实意味着某些查询可以更简单并且性能更好.例如,考虑使用每种方法获取用户'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)