如何为Tinder功能构建数据库

kla*_*sen 5 mysql database data-structures

我正在构建类似于Tinder的功能.人们可以"喜欢"或"跳过"其他人的照片,如果两个人彼此"喜欢"那么就会有匹配.

此功能的数据库结构的最佳方法是什么?我希望能够获得所有比赛的列表以及每个人的所有比赛.

方法1:

Person | JudgedPerson | Like
------ | ------------ | ----
1      | 2            | yes
2      | 1            | yes
1      | 3            | yes
3      | 1            | no
2      | 3            | yes
Run Code Online (Sandbox Code Playgroud)

这看起来像是一种逻辑方法,但很难创建MySql查询来发现匹配.或者有一种简单的方法可以发现它吗?

方法2

Person1 | Person2 | P1LikesP2 | P2LikesP1
------- | ------- | --------- | ---------
1       | 2       | yes       | yes
1       | 3       | yes       | no
2       | 3       | yes       | null
Run Code Online (Sandbox Code Playgroud)

创建查询以获得匹配很容易,但数据模型可能不是最好的.

什么是最好的方法?如果方法1是最好的方法,我可以用什么mysql查询来发现匹配?

Tim*_*sen 6

我没有正式理由为什么我更喜欢第一个选项,但很明显第二个选项没有完全规范化.

要查询第一个表并查找彼此喜欢的人对,您可以尝试以下自联接:

SELECT DISTINCT LEAST(t1.Person, t1.JudgedPerson) AS Person1,
                GREATEST(t1.Person, t1.JudgedPerson) AS Person2
FROM yourTable t1
INNER JOIN yourTable t2
    ON t1.JudgedPerson = t2.Person AND
       t1.Person       = t2.JudgedPerson
WHERE t1.Like = 'yes' AND
      t2.Like = 'yes'
Run Code Online (Sandbox Code Playgroud)

注意:我DISTINCTLEAST/ 一起添加GREATESTSELECT条款,因为每个匹配实际上都是以副本的形式出现的.这样做的原因是,例如,1 -> 2, 2 -> 1将是一个匹配记录,但也2 -> 1, 1 -> 2将是第二个记录.