您知道人们如何寻找类似或推荐的电影或电视剧吗?
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
虽然这种方法会导致重复很多我认为,但我认为查询会有点混乱。任何建议都表示赞赏。
答案 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)也是没用的。为了防止这种情况,您可以再次使用触发器。