1

我目前正在构建一个应用程序,它会根据他们的标签推荐网站。

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

football, model trains, hockey

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

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

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

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

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

你知道怎么做吗?只是一个后续问题,数据库设计是否正确,或者我应该创建一个新表来存储所有标签。类似的东西(虽然不确定)。

您的帮助将不胜感激和奖励!提前致谢!:)

4

4 回答 4

2

我会规范化数据库,以便您在单独的表和关系表中有标签来连接它。像这样:

用户表:

UserId Name
001    John Does

标记用户关系

UserId TagId
001     001

标记表:

TagId TagName
001   Sports

TagUrlRelation

TagId Url
001   nba.com
001   nhl.com

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

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

于 2012-10-09T07:35:42.723 回答
1

这可以通过使用来完成 full text search

参考这里

于 2012-10-09T07:34:43.130 回答
1

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

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

和帖子一样的方式:

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

这大大增加了您编写高效 SQL 的机会。

于 2012-10-09T07:35:21.657 回答
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  

然后你使用JOINs 来获取所需的信息

于 2012-10-09T07:39:55.983 回答