【发布时间】:2011-07-27 08:01:11
【问题描述】:
Stackoverflow 允许发帖者为他们的问题制作标签。
现在假设我有一些文章并想给每个文章一些关键字标签。我为此使用 PHP 和 mysql。
执行此操作时使用的最佳数据库结构是什么?
每篇文章最多 5 个关键字和无限关键字案例是否需要不同的数据库结构?
【问题讨论】:
Stackoverflow 允许发帖者为他们的问题制作标签。
现在假设我有一些文章并想给每个文章一些关键字标签。我为此使用 PHP 和 mysql。
执行此操作时使用的最佳数据库结构是什么?
每篇文章最多 5 个关键字和无限关键字案例是否需要不同的数据库结构?
【问题讨论】:
最好标准化您的数据库。你不会找到更好的。
文章: article_id, blablabla
标签: tag_id,标题
tags_to_articles: article_id,tag_id
在任何情况下,最好标准化您的数据库。总是。如果您会改变主意并限制标签,请不要担心。由于要使用的内存最少,因此上述结构始终是最好的。
【讨论】:
您将有 3 张桌子;
posts - 在这里存储您的所有帖子
标签 - 在这里您存储所有可能的标签
posts_tags - 在这里您可以将您的帖子链接到您的标签,例如它可能只有 3 个 列(id、post_id、tag_id)。
5个关键字的限制应该只是在接口中实现,数据库不应该不同。 posts_tags 表称为联结表,它将 2 个表链接在一起。关系是一对多的,一篇文章可能有很多标签。
【讨论】:
取决于您要使用的数据库类型。
最标准化的应该是这样的
posts - id | title | body |
tags - id | name |
posts_tags - post_id | tag_id
查找会非常快,设置建议只需查看您的 tags 表即可。
您也可以将标签直接嵌入到您的帖子中
posts - id | title | body | tags
tags 只是一个逗号分隔的文本字段。此表上的正常查找可能不会像其他解决方案那样快,并且您必须先使您的集合与众不同,然后才能开始处理建议。一个简单的解决方法是将支持全文的标签表保留为单独的查找。如果您只是运行像 Sphinx 这样的全文搜索系统来处理您的搜索,则此方法效果最佳。
此外,该模式更适合于像 Mongo 这样的 noSQL 解决方案,其中标签只是帖子文档的子文档。
【讨论】:
嗯,我不完全同意其他答案。我的回答是这取决于你的数据。会有多少篇文章。如果它将是大量的artilces,那么其他答案就是要走的路。如果您的文章数量有限(而且总是很少),那么我会将它们存储在同一个表中(article_id、article_text、关键字)。
【讨论】:
我想使用链接表创建多对可能的引用会很好。所以我会创建三个表:articles、tags 和links 来存储链接到article_id 的article_id
也许,有朝一日,面向对象的数据库将取代 db 之类的 mysql - 他们可以在没有任何附加结构的情况下完成这项任务... :)
【讨论】: