我正在电影推荐引擎工作,我正面临数据库设计问题。 我的实际数据库如下所示:
MOVIES [ID,TITLE]
KEYWORDS_TABLE [ID,KEY_ID]
这不是整个数据库,但我在这里展示了什么对我的问题很重要。 我有大约50,000部电影和约1,300万个关键字相关性,基本上我的算法在于提取所有与给定电影具有相同关键字的人,然后按照关键字相关数量排序。
例如,我找了一部类似于“抛弃”的电影,它返回了“六天六夜”,因为它拥有最多的关键词相关性(4个关键词):
Island
Airplane crash
Stranded
Pilot
该算法基于更多因素,但这是最重要也是最困难的方法。
基本上我现在所做的就是让所有至少有一个关键字类似于给定电影的电影,然后通过其他一些暂时不重要的因素进行排序。
如果没有那么多记录就没有任何问题,查询在很多情况下持续10-20秒,其中一些甚至超过5000部电影。 有人已经帮助我(感谢Mark Byers)优化查询,但这还不够,因为它需要更长时间
SELECT DISTINCT M.title
FROM keywords_table K1
JOIN keywords_table K2
ON K2.key_id = K1.key_id
JOIN movies M
ON K2.id = M.id
WHERE K1.id = 4
所以我认为如果我为每部电影预先制作带有电影推荐的列表会更好,但我不知道如何设计表格......这不是一个好主意或者你会如何采取这种方法?
答案 0 :(得分:1)
但回答你当前解决方案中存在的问题,如果进一步的查询优化失败,我会在数据中添加更多冗余,为每部电影存储类似电影的参考(计算可以懒惰地进行,也可以每天在cron作业中进行这些值不应经常改变。)