最佳数据库(MySQL)结构:包含优惠标签的文章

时间:2009-05-22 22:55:41

标签: php mysql tags tagging

我建了一个新闻网站:   - 文章显示在首页,按日期排序。最新的一个。   - 新闻在“新闻”表中,字段为“id”,“title”,“text”和其他一些字段。   - 所有文章都标有1-5个相关标签。   - 标签在表“标签”中,字段为“id”,“tag”,“article”和其他一些。   - “标签”字段“文章”适合“新闻”字段“id”。

现在我想让用户有机会将标签添加到他的“青睐标签列表”中。然后,用户应该只看到包含一个有利标签的新闻文章。

假设用户Bob喜欢标签“barack obama”,“nba”,“new jersey”和“dogs”。他应该只看到包含这四个标签中至少一个的文章。

我如何编写实现此目的的PHP / MySQL脚本?我认为我的数据库结构不适合这个目的,是吗?我必须像这样进行数据库查询:

“SELECT * FROM news WHERE id IN(SELECT article FROM tags WHERE tag IN('barack obama','nba','new jersey','dogs'))”

这个查询会运行很长时间,不是吗?必须有一个比我的更合适的数据库结构。你有这个问题的想法吗?我需要哪种数据库结构以及我必须使用哪些查询?

我希望你能帮助我。提前谢谢!

2 个答案:

答案 0 :(得分:8)

以下内容并非详尽无遗,但它应该让您朝着正确的方向前进。

表:

news
=====
id
title
text

tag
===
id
tag

tag_map
=======
tag_id
news_id

favorite_tags
=============
user_id
tag_id

查询

SELECT * 
FROM favorite_tags
JOIN tag_map ON favorite_tags.tag_id = tag_map.tag_id
JOIN news ON tag_map.news_id = news.id
WHERE favorite_tags.user_id = $userid

答案 1 :(得分:1)

查询的性能(无论是在您的子选择方法中,还是Frank Farmer更优雅的基于连接的方法)将主要取决于索引。请记住,MySQL每个表只使用一个索引,并且正确的索引集(取决于您要优化的查询)总是变得非常明显......