我目前正在构建一个应用程序,建议基于其标记的网站。
在我的网站上,当用户注册时,它将填写兴趣。所以这是一个样本兴趣:
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的兴趣有体育标签。
你知道怎么做那个吗?只是一个后续问题,数据库设计是正确的还是我应该创建一个新表来存储所有标签。这样的事情(虽然不确定)。
非常感谢您的帮助和奖励!提前致谢! :)
答案 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
答案 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
来获取所需信息