具有多个标记的帖子的数据库架构

时间:2013-06-20 03:08:09

标签: sql-server database sql-server-2008 database-schema

我正在构建典型的帖子和标签应用,其中帖子可以有多个标签。我坚持设置数据库架构。我到目前为止:

发布:
POST_ID PRIMARY KEY
    POST_TITLE
    POST_BODY
    POST_DATE
    POST_USERID

标签:
TAG_ID PRIMARY KEY
    TAG_TAGNAME


PT:
PT_ID
PT_POSTID
PT_TAGID


当用户提交帖子时,我将表单数据插入到post表中。下一步,我遍历用户提供的标记名,看看它们是否在TAG_TAGNAME字段中。如果匹配,请获取ID并将其插入PT表。 ELSE将名称插入到标记表中并获取ID并将其插入到PT表中。两者都与POST表插入中生成的postid一起。
最后,我有一个名为PTVIEW的视图,其中包含以下模式:

SELECT *
来自dbo.PT
加入帖子 ON PT_PostID = dbo.Post.POST_ID
加入标签
ON PT_TagID = tag.TAG_ID

以下是来自PTVIEW
的select *的示例结果 enter image description here


问题是我无法查看唯一帖子及其标签。
我正在使用MSSQL,因此我没有在mySQL中内置Group_concat函数。

我无法构建初始页面,该页面将显示每个帖子及其相关标签,例如主页上的stackoverflow。我在PTVIEW中做错了什么?

2 个答案:

答案 0 :(得分:2)

你基本上有两个选择:

  1. 将其分成两个不同的查询,获得一个帖子,然后得到它 相关标签。
  2. 使用类似的语句将标记连接到单个字段中 这样的:
  3. SELECT DISTINCT
            P.Post_ID ,
            SUBSTRING(( SELECT  ',' + T.TAG_TAGNAME AS [text()]
                        FROM    dbo.PT PT
                                INNER JOIN dbo.Tag T ON PT.PT_TAGID = T.TAG_ID
                        WHERE   P.POST_ID = PT.POST_ID
                      FOR
                        XML PATH('')
                      ), 2, 1000) [Tags]
    FROM    dbo.Post P
    

    即使第二个选项看起来有点漂亮,第一个选项也有我的个人偏好。 我认为第二个不太可读,性能在较大的数据集上不会很好。

答案 1 :(得分:1)

以下是我学会如何做到这一点。

  SELECT * 
    ,(
        SELECT TAG_TAGNAME+ ', '
        from PT
        JOIN Tag ON PT_TagID = TAG_ID
        Where PT_PostID = POST_ID
        ORDER BY TAG_TAGNAME
        FOR XML PATH('')
    ) AS Tags
    FROM Post