在SQL Server中保存数据,正确的方法

时间:2010-01-03 22:06:42

标签: sql-server xml database-design tagging

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

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

我是否应该为标签创建一个单独的表,并使用XML列(如

)更新TAG的ID列,其中包含列出它的帖子的ID
TABLE_TAGS
TAG_NAME varchar, ARTICLE_IDS XML

OR

在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)

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

还有其他提示吗?

由于

4 个答案:

答案 0 :(得分:4)

articletags_model_01

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果是我 - 这可能不对......

除了文章表之外,我还会选择两张桌子:

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

这将涉及维护文章标签的一大部分工作(解析标签列表,标签是否存在,如果不是创建等)但是另一方面(搜索 - 通过标签和标签,显示,计数对于你的标签云)应该更容易,更重要的是,你可以索引的东西更快。因为在搜索时你应该做的阅读远远超过写入速度是关键的性能目标。

答案 3 :(得分:0)

在数据库中存储XML自然不利于提高性能。考虑通过具有实现关系的多对多表来将标记以标准化方式存储到文章关系中:

Table: ArticleTag

ArticleId int
TagId int

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