优化mysql查询以获取每个用户的"看不见"条目

Éri*_*ins 9 mysql optimization node.js

这个标题相当令人着迷,但我无法想出更清楚的东西.

简而言之,我们正在创建一个连接到与mySql数据库通信的node.js服务器的移动应用程序.很常见的设置.现在,我们连接了多个用户,可以将"时刻"上传到我们的服务器.所有其他用户只能看到这些时刻.

一旦用户x看到另一个用户y的时刻,x就无法看到这个时刻.也许有点像Snapchat,除了那个时刻是单个用户到多个用户而不是单个到单个用户.根据当前用户的位置,时间也按距离排序.

现在,我正在寻找一种只从数据库中获取"看不见"的时刻的智能方法.目前,我们正在使用用户和时刻之间的关系表.

假设用户(ID = 20)看到片刻(ID = 30320),然后我们插入此表20和30320.我知道.这难以扩展,可能是一个糟糕的主意.

我想过可能会检查最后一次看到的日期并且仅获取超过此日期的时刻,但是再一次,按日期排序之前的时刻按照距离排序,这样就可以看到3分钟之后的片刻,然后是是30秒.

有没有更聪明的方法,或者我注定要使用Moments和Users之间的关系表,并在查询时加入它?

非常感谢.

编辑 -

该逻辑总共使用3个表.

  • 用户
  • 时刻
  • MomentSeen

MomentSeen只包含用户看到的时刻和时间.由于时间没有按日期排序,我无法获取在最后一刻之后上传的所有时刻.

编辑 -

我刚刚意识到移动应用程序Tinder必须使用类似的逻辑,用户"喜欢"其他用户.由于你不能及时回过头来看两次用户,他们可能会使用与我正在寻找的非常相似的查询.

考虑到他们有很多用户,并且按照距离和其他一些未知标准进行排序,必须有比"UserSawUser"关系表更聪明的做事方式.

编辑

我无法提供整个数据库结构,因此我将只留下重要的表格和一些字段.

Users { 
    UserID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
}

Moments {
    MomentID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    UploaderID INT UNSIGNED, /* FK to UserID */
    TimeUploaded DATE /* usually NOW() while insertion */
} 

MomentSeen {
    /* Both are FK to Users and Moments */
    MomentID INT UNSIGNED,
    UserID INT UNSIGNED
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*mes 0

不要每个用户使用一张表。 暂时只用一张桌子。

您似乎对“时刻”有两种相互冲突的排序:“距离”和“看不见”;是哪一个?

如果它是“看不见的”,那么这些“时刻”是否按时间顺序编号?这意味着每个用户都有一个last_moment_seen——所有Moments在此之前都已经看过的;之后的一切都没有见过。所以...

SELECT ...
    WHERE moment > ( SELECT last_moment_seen
                        FROM Users WHERE user_id = $user_id );
Run Code Online (Sandbox Code Playgroud)

将获得给定用户尚未看到的所有时刻。

咀嚼一会儿;回来寻求更多建议。

编辑

这应该会给你尚未看到的时刻。然后您可以根据需要订购它们。

SELECT m....
    FROM Moments m
    LEFT JOIN MomentSeen ms  ON ms.MomentID = m.MomentID
    WHERE ms.MomentID IS NULL
    ORDER BY ...
    LIMIT 1   -- if desired
Run Code Online (Sandbox Code Playgroud)