【问题标题】:keyword tags structure关键词标签结构
【发布时间】:2011-07-27 08:01:11
【问题描述】:

Stackoverflow 允许发帖者为他们的问题制作标签。

现在假设我有一些文章并想给每个文章一些关键字标签。我为此使用 PHP 和 mysql。

执行此操作时使用的最佳数据库结构是什么?

每篇文章最多 5 个关键字和无限关键字案例是否需要不同的数据库结构?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    最好标准化您的数据库。你不会找到更好的。

    文章: article_id, blablabla

    标签: tag_id,标题

    tags_to_articles: article_id,tag_id

    在任何情况下,最好标准化您的数据库。总是。如果您会改变主意并限制标签,请不要担心。由于要使用的内存最少,因此上述结构始终是最好的。

    【讨论】:

    • 我猜当 3 个人说几乎相同的时候,它的路要走:D
    • 就教科书结构而言,这是完美的,但在现实世界的使用中,一旦许多文章被标记,它是否会成为减速的牺牲品?
    • @David19801 不。这种结构非常轻量级,您只需一个简单的查询即可访问所有关键字。每个数据库都需要规范化。阅读它,例如在这里:en.wikipedia.org/wiki/Database_normalization
    • 谢谢。最后一个问题,三个表的 Innodb 还是 Myisam?
    • @David19801 在小型数据库中您不会注意到有很大的不同,但 Innodb 较新,从 v5.5 开始,它已成为 MySQL 数据库的默认机制。
    【解决方案2】:

    您将有 3 张桌子;

    posts - 在这里存储您的所有帖子

    标签 - 在这里您存储所有可能的标签

    posts_tags - 在这里您可以将您的帖子链接到您的标签,例如它可能只有 3 个 列(id、post_id、tag_id)。

    5个关键字的限制应该只是在接口中实现,数据库不应该不同。 posts_tags 表称为联结表,它将 2 个表链接在一起。关系是一对多的,一篇文章可能有很多标签。

    【讨论】:

      【解决方案3】:

      取决于您要使用的数据库类型。

      最标准化的应该是这样的

      posts - id | title | body | 
      tags - id | name |
      posts_tags - post_id | tag_id
      

      查找会非常快,设置建议只需查看您的 tags 表即可。

      您也可以将标签直接嵌入到您的帖子中

      posts - id | title | body | tags 
      

      tags 只是一个逗号分隔的文本字段。此表上的正常查找可能不会像其他解决方案那样快,并且您必须先使您的集合与众不同,然后才能开始处理建议。一个简单的解决方法是将支持全文的标签表保留为单独的查找。如果您只是运行像 Sphinx 这样的全文搜索系统来处理您的搜索,则此方法效果最佳。

      此外,该模式更适合于像 Mongo 这样的 noSQL 解决方案,其中标签只是帖子文档的子文档。

      【讨论】:

        【解决方案4】:

        嗯,我不完全同意其他答案。我的回答是这取决于你的数据。会有多少篇文章。如果它将是大量的artilces,那么其他答案就是要走的路。如果您的文章数量有限(而且总是很少),那么我会将它们存储在同一个表中(article_id、article_text、关键字)。

        【讨论】:

        • 您无法预测未来的文章和/或关键字的数量。您可以通过这种方式降低性能并强迫某人在将来编写脚本来规范您的数据库。
        • 当然可以,您是在创建个人博客系统(您必须非常努力地创建 10k 篇文章)还是在创建新的 Stack Overflow?还有更多的考虑因素,例如所有或部分标签的更新频率、您如何搜索(通配符?)、您搜索的频率等。我想说的是,您应该查看您的应用程序以做出最好的决定和规范化并不是*总是8最好的解决方案。
        【解决方案5】:

        我想使用链接表创建多对可能的引用会很好。所以我会创建三个表:articlestagslinks 来存储链接到article_idarticle_id

        也许,有朝一日,面向对象的数据库将取代 db 之类的 mysql - 他们可以在没有任何附加结构的情况下完成这项任务... :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-19
          • 1970-01-01
          • 2018-07-18
          • 2013-01-26
          • 2018-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多