根据用户兴趣创建推荐算法

时间:2012-10-09 07:29:33

标签: php mysql algorithm

我目前正在构建一个应用程序,建议基于其标记的网站。

在我的网站上,当用户注册时,它将填写兴趣。所以这是一个样本兴趣:

football, model trains, hockey

所以用逗号分隔。因此,当用户单击将保存在我的数据库中的寄存器时。这是我的数据库的设计。

userID |  name     | interest
001    | John Doe  | sports, model trains, hockey

另一方面,我的网站中也有用户上传网站网址,并创建与其相关的标记。所以这是我的数据库设计:

    postID  |  title           | tags
     001    |  techcrunch.com  | technology,softwares,startups
     002    |  nba.com         | basketball,sports,all-star
     003    |  tmz.com         | gossip, showbiz

所以这个的逻辑是,我想向NBA用户推荐NBA.com,因为NBA.com有运动标签,John Doe的兴趣有体育标签。

你知道怎么做那个吗?只是一个后续问题,数据库设计是正确的还是我应该创建一个新表来存储所有标签。这样的事情(虽然不确定)。

非常感谢您的帮助和奖励!提前致谢! :)

4 个答案:

答案 0 :(得分:2)

我会对数据库进行规范化,以便在单独的表和关系表中使用标记来连接它。就这样:

用户表:

UserId Name
001    John Does

TagUserRelation

UserId TagId
001     001

标签表:

TagId TagName
001   Sports

TagUrlRelation

TagId Url
001   nba.com
001   nhl.com

为了提高性能,我将继续创建具有必要连接的索引视图,并实现存储过程以使用它们。

如上所述,另一种选择是全文搜索,但这种情况要慢得多,在这种情况下通常不被视为良好的数据库设计。

答案 1 :(得分:1)

可以使用 full text search

来完成

refer here

答案 2 :(得分:1)

你应该创建两个单独的表,其中包含单个标签,每个人或每个帖子有几个。 如果您愿意,可以为它创建一个多列主键。

userID | interest
001    | sports
001    | model trains
001    | hockey
...

和帖子的方式相同:

postID | tags
003    | gossip
003    | showbiz
...

这极大地提高了编写高效SQL的机会。

答案 3 :(得分:1)

分别存储标签会好得多。这样你就有了一个标签表和另外两个表 - 一个用于用户和标签之间的关系,另一个用于帖子和标签之间的关系。

users
----------------------------------------
userId |   name    |   password   | ....
  1    | John Doe  | $p$fgA       |  

tags
--------------------
tagId  | tagname
1      | basketball
2      | hockey

user_interests
----------------------------
id   |   user_id  |  tag_id
1    |  1         |  1
2    |  1         |  2

post_tags
--------------------------
id  |  post_id  |  tag_id
1   |  1        |  2  

然后使用JOIN来获取所需信息