“recomendations”表结构

时间:2011-02-28 19:34:00

标签: mysql sql database-design

您知道人们如何寻找类似或推荐的电影或电视剧吗?

http://www.anime-planet.com/anime/devil-may-cry

看看底部是如何分享推荐的动漫,并且它们是相互关联的建议,所以如果你在B上链接A-to-B你也可以看到A, A到B B-to-C
C -not- A

我的问题是如何最好地处理这些条目?

Listings_Table

  • LIST_ID

  • LIST_TITLE

  • list_content

Recommends_Table

  • list_id_A

  • list_id_B

虽然这种方法会导致重复很多我认为,但我认为查询会有点混乱。任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:1)

您所指的是一个相对简单的推荐引擎。对于您手动分配建议的小数据集,它可以正常工作,其中A指向B,B指向C,但它不是一个非常可扩展的方法。一旦你击中了不少数量的产品,它就变得太难以维护了(在我看来)。

你可以找到更好的东西是使用更复杂的东西。看看人们如何使用谷歌的预测API(http://code.google.com/apis/predict/docs/samples.html#demos)来做这种非常类型的预测。在这种情况下,您不会存储实际的链接,而是存储用户喜欢的内容,然后查看该信息以构建您的推荐。

虽然Prediction API不是一个适合所有人的完美解决方案,但它可以为您提供一种非常简单的方法来构建网站的推荐部分,而无需深入学习机器学习技术。

至于上面的表结构,如果您这样做,就不需要复制数据。相反,我建议您在suggest_table的两个列中查找您所在的元素。

例如,如果您在“Recommendations_table”中有以下记录

list_id_A, list_id_B
1, 2
9, 12
2, 3

您可以使用联合查询来获取与“2”相关的所有内容,例如:

select list_id_A from recommendations_table where list_id_B = 2
union
select list_id_B from recommendations_table where list_id_A = 2

此外,您可以添加更多sql以确保只返回唯一结果。但最后,你如何填充这些信息,因为这可能比任何事情都有所不同。

如果你想更进一步使用不同的技术,比如像Cassandra这样的nosql数据存储,你可以拥有一个叫做推荐的列系列,你的密钥就是你正在查看的电影。然后,后续的列名称将是推荐的电影ID。在这种情况下,你会对结构有这样的东西:

Key, columns.....
Movie A, 4, 5, 67,1, 9,3
Movie B, 3, 4, 1

在这种情况下,您将获取特定键的所有列名称,这将是您的推荐列表。

所有这些都是学术上的,不知道你打算如何填充数据。

答案 1 :(得分:0)

如果(list_id_A,list_id_B)是Recommends_Table的主键,则不会有任何dublicates。此外,如果您希望链接是双向的,那么在将新行插入Recommends_Table时,例如(A,B),您还必须插入(B,A)。在这种情况下,触发器会有所帮助。

或者,您只能插入(A,B)或仅插入(B,A)并使用dmcnelis建议的查询:

select list_id_A from recommendations_table where list_id_B = 2
union
select list_id_B from recommendations_table where list_id_A = 2

我认为替代解决方案更好,因为您将在Recommends_Table中存储更少的数据。但是,在这种情况下,如果表中已经有一个(A,B)行,那么插入一个(B,A)也是没用的。为了防止这种情况,您可以再次使用触发器。