【问题标题】:Saving data in SQL Server, the right approach在 SQL Server 中保存数据,正确的方法
【发布时间】:2011-01-01 01:50:29
【问题描述】:

我们有用于发布文章的内部应用程序,使用 SQL Server 2005。

对于我需要在用户发布帖子时保存标签列表的任务。

我是否应该为标签创建一个单独的表,并使用列出它的帖子的 ID 更新标签的 ID 列,使用 XML 列,如

TABLE_TAGS
TAG_NAME varchar, ARTICLE_IDS XML

在 ARTICLE 表本身中创建一个列,如

TABLE_ARTICLE 
COLUMN_TAGS XML //  and store tag, the post is associated with.

当用户点击“标签云”中​​的特定标签时,我们需要显示带有该标签的帖子,就像任何博客一样。我们还需要嵌套的 SQL 语句来显示更多点击或讨论等的帖子,例如

SELECT ARTICLE_TITLE, ARTICLE_URL FROM
TABLE_ARTICLE 
WHERE
ARTICLE_ID = 
(SELECT ARTICLE_IDS FROM TABLE_TAGS
WHERE TAG_NAME = @TAGTOFIND)

我不确定在添加、更新或效率方面如何以及什么是最佳方法。

还有其他提示吗?

谢谢

【问题讨论】:

    标签: sql-server xml database-design tagging


    【解决方案1】:

    处理多对多关系的常用方法是使用连接表(又名junction table、桥接表、直通表、etc....)。因此,您将有一个标签表、一个文章表和第三个“文章上使用的标签”表,其中只有 TagId 和 ArticleId 外键。要找出哪些标签与任何给定文章相关联,或者哪些文章与任何给定标签相关联,您需要对目标表(标签或文章)和连接表执行连接查询。

    【讨论】:

      【解决方案2】:

      如果是我——这可能不对……

      除了您的文章表之外,我还会使用两个表:

      • 标签的一个表:ID,标签
      • 将文章链接到标签的一个表:ArticleID、TagID

      这将涉及维护文章标签的大量工作(解析标签列表,标签是否存在,如果不创建等),然后是另一边(搜索 - 按标签和标签,显示,计数为您的标签云)应该更容易,更重要的是,更快,因为您可以索引事物。因为在搜索时您的读取速度应该远远超过写入速度是关键性能目标。

      【讨论】:

        【解决方案3】:

        将 XML 存储在数据库中自然不利于性能。考虑以规范化的方式将标签存储到文章关系中,通过一个实现关系的多对多表:

        Table: ArticleTag
        
        ArticleId int
        TagId int
        

        这使您无需借助数据库中的 XML 支持即可查询标签和文章。

        【讨论】:

          【解决方案4】:

          SELECT  ArticleTitle
                 ,ArticleURL
          FROM    Article AS a
                  JOIN Article_Tag AS x ON x.ArticleID = a.ArticleID
                  JOIN Tag AS t ON t.TagID = x.TagID
          WHERE   t.TagName = @SomeTag
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-27
            • 2020-03-18
            • 2014-07-06
            • 1970-01-01
            • 2014-02-20
            • 2021-05-14
            相关资源
            最近更新 更多