mysql选择facebook的feed中的记录

时间:2014-03-03 13:59:49

标签: mysql sql

我认为这是一个非常具有挑战性的问题。

我有一个“用户”表:

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个最相关的帖子。

我知道这很复杂,希望有人能指出我正确的方向。谢谢

1 个答案:

答案 0 :(得分:2)

这个问题有几个部分,大多数都需要重新思考。

首先是“相似”的部分。在MySQL中有几乎一种方法可以做到这一点,如果一个位置是另一个位置的一部分,比如“约克”是“纽约”的一部分,那么你会发现“纽约”类似于“约克”。现在,如果您有关于位置的其他数据,例如地质坐标或区域或州等一般区域,那么您可以将相似性定义为“处于相同状态的城镇”。

与兴趣的相似性可能更简单 - 你可以找出两个人之间有多少兴趣匹配。为了使这更容易,您应该将兴趣表组织成长格式,这意味着表结构将如下:

USERID_1 | INTEREST_1
USERID_1 | INTEREST_2
etc

至于构建实际查询 - 你应该逐步接近它。

1)假设我们尝试为用户ID为userID的当前用户生成结果。由于连接是通过位置和兴趣,我们应该首先查询当前用户的位置和兴趣。

2)获取当前用户的位置并查询具有相似位置的用户,但是您决定定义“类似”。如果您设法定义相似性度量标准,那么也要查询它。我的意思是“处于相同的状态比在同一个大陆上更相似”。以这种方式保存用户。

3)对当前用户的兴趣做同样的事情并保存找到的用户。

4)合并两个列表,可能根据相似性度量并保存结果用户列表。

5)根据此列表查询帖子,选择其中的10个。将这些保存到新表中,同时将当前用户ID保存为时间戳。下次启动此过程时,首先检查新表,看看自从为当前用户生成此列表后是否已经过了20分钟 - 如果它已经生成了新列表,如果没有,则使用表中的列表。

它实际上没有听起来那么复杂:)