线程论坛的最佳数据库结构是什么?

时间:2008-12-12 08:30:29

标签: database-design forum

我想为电子教学网站建立一个线程论坛(opensource asp.net mvc ofcourse,尽管这对于这个问题无关紧要)。

什么是DB结构,有助于检索具有最佳性能的论坛帖子?我不是说不。因为它可能会随着检索的行数而变化。

此外,我应该能够将特定线程与另一个线程链接起来。例如。显示“相关论坛链接”。

我正在使用SQL Server 2005。

以下是我想到的结构(无耻地从中获取) Stephen Walther Excellent blog post

表:论坛

· Id
· ParentId  (null if this is the first message)
· ParentThreadId  (Identify message in the same thread)
· Author
· Subject
· Body
· PostedDate

表:RelatedForum

· ForumId
· RelatedForumId

欢迎提出意见/建议。

提前致谢。

3 个答案:

答案 0 :(得分:2)

如果你有一个非递归的自上而下(论坛 - >线程 - > Postings)检索你的数据为最常见的用例,那么这个表结构是一个好的开始,因为这主要是在WHERE ParentId = @SomeId个查询中。

如果您希望能够计算“此论坛/主题中存在多少个帖子?”之类的内容,您将很容易陷入无法判断哪些ID嵌套到哪个其他ID(即儿童关系不见了。)

您可以通过在每个帖子中冗余保存ThreadIdForumId来解决这个问题。然后你就可以问SELECT COUNT(*) FROM Postings WHERE ThreadId = @SomeId

这些ID不太可能在给定的帖子中发生变化,因此冗余不会立即创建插入/更新异常,但您应该有一个程序来更新所有相关的帖子,如果您决定使用正确的ID移动东西。

对于将层级数据存储到RDBMS的更高级方法,您可以查看这个问题的答案(这是我自己的,“没有钓鱼投票”意图):"What is the most efficient/elegant way to parse a flat table into a tree?"

答案 1 :(得分:0)

表:帖子

· ThreadId
· UUID
· Author
· Subject
· Body
· PostedDate  

表:线程

·ThreadID
·Forum
·UUID
·Author
·Subject
·Body
·PostedDate

仅在具有缓存和索引的MySQL服务器上。否则这个结构不是最好的,但是对于所述服务器,这使得计数和全文搜索变得容易

答案 2 :(得分:0)

看起来不错。我会简单地调用ParentThreadID ThreadID。添加ForumID不会受到伤害,尤其是出于计数目的。

您应该添加AuthorName。推测作者是您的用户表的ID。拉出该用户的名字并立即附加。这样可以省去在显示线程或响应列表时从用户表中查找50个名称的麻烦。同样,如果用户从系统中删除,则无法再查找该名称。当然不想从树中删除这些节点。