【问题标题】:Best DB (MySQL) structure: Articles which contain favored tags最佳数据库(MySQL)结构:包含喜欢标签的文章
【发布时间】:2009-05-22 22:55:41
【问题描述】:

我建立了一个新闻网站: - 文章按日期排序显示在首页。先上最新的。 - 新闻在“新闻”表中,包含“id”、“title”、“text”和其他一些字段。 - 所有文章都标有 1-5 个相关标签。 - 标签位于“标签”表中,其中包含“id”、“标签”、“文章”和其他一些字段。 - “tags”的“article”字段适合“news”的“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'))"

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

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

【问题讨论】:

    标签: php mysql tags tagging


    【解决方案1】:

    以下内容绝不是详尽/明确的,但它应该让您朝着正确的方向前进。

    表格:

    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
    

    【讨论】:

    • 非常感谢您的快速和良好的回答。我有最后一个问题:我应该在哪些字段上设置索引?我在“news”中选择“id”作为主要,在“tag”中选择“id”作为主要,在“tag”中选择“tag”作为唯一,“tag_id,news_id”作为主要,在“tag_map”中选择“news_id”和,最后,“user_id,tag_id”作为主要和“tag_id”在“favorite_tags”中。这是正确的吗?
    • 粗略看似乎是对的,但是,通过填充表格并执行“解释选择”等来仔细检查。
    • 我认为您需要 tag_map.tag_id、news.id 和 favorite_tags.user_id 上的索引,用于此查询。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,我在 Frank Farmer 的回答中添加了一个关于索引的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多