我认为这是一个非常具有挑战性的问题。
我有一个“用户”表:
ID | name
我有一个LOCATIONS表,用于存储用户位置:
USERID | location
我有一个USERS_INTERESTS表:
USERID | interests (comma-separated IDs of the INTERESTS table )
领域:
interest_ID | interest_name
帖子_
post_ID | userPosting | description | post_datetime
我现在需要创建类似Facebook的Feed,我会根据用户的位置和兴趣选择与我最相似的用户帖子。
我应该选择与我“相似”的用户插入的最后10个帖子(在我的位置和/或与地雷最常见的兴趣)。
此外,这应该以某种“优先”来完成:
我根据自己的兴趣选择了我所在位置的用户帖子
如果记录太少,我会在同一位置包含用户的帖子,并且有一些共同的兴趣
如果还不够,我会在我的位置添加用户帖子。
还不够,这应该按时完成:我每隔20分钟选择10个最相关的帖子。
我知道这很复杂,希望有人能指出我正确的方向。谢谢
答案 0 :(得分:2)
这个问题有几个部分,大多数都需要重新思考。
首先是“相似”的部分。在MySQL中有几乎一种方法可以做到这一点,如果一个位置是另一个位置的一部分,比如“约克”是“纽约”的一部分,那么你会发现“纽约”类似于“约克”。现在,如果您有关于位置的其他数据,例如地质坐标或区域或州等一般区域,那么您可以将相似性定义为“处于相同状态的城镇”。
与兴趣的相似性可能更简单 - 你可以找出两个人之间有多少兴趣匹配。为了使这更容易,您应该将兴趣表组织成长格式,这意味着表结构将如下:
USERID_1 | INTEREST_1
USERID_1 | INTEREST_2
etc
至于构建实际查询 - 你应该逐步接近它。
1)假设我们尝试为用户ID为userID
的当前用户生成结果。由于连接是通过位置和兴趣,我们应该首先查询当前用户的位置和兴趣。
2)获取当前用户的位置并查询具有相似位置的用户,但是您决定定义“类似”。如果您设法定义相似性度量标准,那么也要查询它。我的意思是“处于相同的状态比在同一个大陆上更相似”。以这种方式保存用户。
3)对当前用户的兴趣做同样的事情并保存找到的用户。
4)合并两个列表,可能根据相似性度量并保存结果用户列表。
5)根据此列表查询帖子,选择其中的10个。将这些保存到新表中,同时将当前用户ID保存为时间戳。下次启动此过程时,首先检查新表,看看自从为当前用户生成此列表后是否已经过了20分钟 - 如果它已经生成了新列表,如果没有,则使用表中的列表。
它实际上没有听起来那么复杂:)