2010-12-13 63 views
2

可能重复:
How do you recommend implementing tags or tagging最好的实现标签(类似的StackOverflow)

我有一个包含若干条数据库的网站。我想在stackoverflow上实现类似于标签的标签。

我能想到的实现它们两种基本方式:

  1. 与我的文章表中的一个一对多的关系,创建一个单独的标签表。

  2. 添加标签文本字段到我的文章表。

第一种方法似乎是最好的,但需要两个额外的表,这将增长得相当大。似乎也会有相当大的开销更新和维护这些数据。

第二种方法将更容易实施和维护,并使用更少的资源。但是搜索效率会降低。我可能会使用LIKE或甚至全文搜索。

我对其他人认为最好的方法很感兴趣。或者也许还有另一种方法。

+0

也[如何实现标记系统](http://stackoverflow.com/questions/1810356/how-to-implement-tag-system) – 2010-12-13 23:11:29

+0

谢谢,我确实看过,但不能使用正确的搜索条件。我已经打印出所有这些线程了。 – 2010-12-14 00:16:11

回答

7

我个人会选择1,你后面再提两个表格,所以我假设你在考虑。

Table -Tag 
Fields - TagID, TagName 

Table -TagArticle 
Fields - ArticleID, TagID 

Table - Article 
Fields - ArticleID, blah, blah, blah 

与倾倒到文章中的字段相比,这不需要更多的存储方式。再加上它是正常化的,它将永远支持你的未来,并将使你的数据库能够更好地通过标签搜索文章。至于更新,相比于你阅读的次数,你偶尔会偶尔更新,所以影响应该可以忽略不计,除了确保你的索引是最新的,你不会想到任何维护任务无论如何都必须在其他桌子上做,并且应该是自动的。

附加福利意味着您可以快速创建顶级标签列表或标签云等内容。

+0

好吧,我希望它需要更多的存储额外的表和关系,但也许它会被不必重复标签词本身足够抵消。我的实际情况可能会更复杂一些。例如,我可能有不同类型的标签链接平台,语言,库等。我不确定,但这种方法也应该很好地工作。谢谢。 – 2010-12-14 00:20:53

+0

@Jonathan Wood - 我不确定表的开销,但是如果你使用一个int来表示每个int有4个字节的ID,那么tagarticle每行包含8个字节,varchars是每个字符1个字节+ 2字节开销。把你的问题上的3个标签需要24个字节,将它们存储在一个文本字段中(假设你使用1个字符分隔符)需要30个字节,标签文章列上的2个索引可能会抵消你的全文索引以搜索标记字段。 – Robb 2010-12-16 20:46:03

+0

那么,除了表格本身之外,你还需要索引。但我实际上更关心维护数据所需的开销。在文本字段中,您只需保存用户输入的数据。使用多个表格,你必须对数据库进行一些检查:这个标记是否已经定义 - 如果不是,那么这篇文章就已经与这个标记相关联 - 如果没有,就创建。和类似的步骤来删除标签。对于连接到Web的数据库,它肯定会表示额外的工作量。也就是说,我仍然倾向于你所建议的方法。只是想知道效果。 – 2010-12-16 21:50:08

2

第一种选择显然是两者中最好的。这适用于关系模型,并使数据标准化。第二个选项针对关系模型,并打破标准化。你如何运行诸如“给我最受欢迎的十大标签”之类的查询?或者“标签'x'被使用了多少次?”对于选项1,这些查询变得微不足道,特别是(假设Robb的模式),您可以针对每个标签保留一个Count列。

选项2使您在功能损失方面稍微简化(从长远来看,我认为效率也如此)。关系模型已经过尝试,测试和工作!用它!

+0

谢谢,所有有效的点。 – 2010-12-14 00:21:42

相关问题