Asp.net 实现标记的最佳方法(类似于StackOverflow)

Asp.net 实现标记的最佳方法(类似于StackOverflow),asp.net,sql-server,algorithm,Asp.net,Sql Server,Algorithm,可能重复: 我有一个带有数据库的网站,其中包含许多文章。我想实现与stackoverflow上的标签类似的标签 我可以想出两种基本的实施方法: 创建一个与my Articles表具有一对多关系的单独标记表 将标记文本字段添加到我的文章表中 第一种方法似乎是最好的,但需要两个额外的表,它们会变得相当大。更新和维护这些数据似乎也会有相当大的开销 第二种方法更容易实施和维护,并且使用更少的资源。但搜索效率会降低。我可能会使用LIKE甚至全文搜索 我对别人认为最好的方法感兴趣。或者可能还有另一种方法。

可能重复:

我有一个带有数据库的网站,其中包含许多文章。我想实现与stackoverflow上的标签类似的标签

我可以想出两种基本的实施方法:

  • 创建一个与my Articles表具有一对多关系的单独标记表

  • 将标记文本字段添加到我的文章表中

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

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


    我对别人认为最好的方法感兴趣。或者可能还有另一种方法。

    我个人会选择选项1,您稍后会提到另外两个表,所以我假设您正在考虑

    Table -Tag
    Fields - TagID, TagName
    
    Table -TagArticle
    Fields - ArticleID, TagID
    
    Table - Article
    Fields - ArticleID, blah, blah, blah
    
    这不应该比在文章中转储到字段需要更多的存储方式。此外,它是标准化的,这将始终为您的未来带来好处,并使您的数据库能够更好地按标签搜索文章。至于更新,与您正在阅读的次数相比,您很可能只是偶尔更新,因此影响应该可以忽略不计。除了确保您的索引是最新的之外,我想不出任何维护任务,您无论如何都必须在其他表上执行,并且应该是自动化的


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

    第一个选项显然是这两个选项中最好的。这适用于关系模型,并使数据正常化。第二个选项针对关系模型工作,并破坏规范化。您将如何运行诸如“给我十大最受欢迎的标签”之类的查询?或者“标记‘x’被使用了多少次?”这些查询对于选项1来说变得微不足道,尤其是(假设Robb的模式)您可以针对每个标记保留一个计数列


    选项2为您带来了功能上的巨大损失(从长远来看,我认为,效率也是如此)的轻微简化。该关系模型经过了尝试、测试并运行良好!用它

    也谢谢,我确实看了,但一定不要使用正确的搜索词。我已经打印出了所有这些线程。我希望它需要更多的存储空间来存储额外的表和关系,但也许不必重复标记词本身就足以抵消这些线程。我的实际情况可能更复杂一些。例如,我可能有不同类型的标签链接平台、语言、库等。我不确定,但这种方法也应该适用。谢谢。@Jonathan Wood-我不确定一个表的开销,但是如果你使用一个int作为ID,即每个int有4个字节,那么tagarticle每行包含8个字节,varchars是每个字符1个字节+2个字节的开销。在你的问题“我的表”中获取3个标记需要24个字节,将它们存储在文本字段中(假设你使用1个字符分隔符)需要30个字节,标记文章列上的2个索引可能会抵消搜索标记字段的全文索引。好的,除了表本身,你还需要索引。但实际上我更关心的是维护数据所需的开销。在文本字段中,您只需保存用户输入的数据。使用多个表,您必须对数据库进行几项检查:是否已经定义了这个标记——如果没有,则创建,本文是否已经与这个标记关联——如果没有,则创建。以及删除标记的类似步骤。对于连接到web的db,它肯定代表了额外的工作负载。尽管如此,我仍然倾向于你建议的方法。只是想知道效果如何。