一个分级论坛的最佳数据库结构是什么?

3

我想为一个电子学习网站构建一个带线程的论坛(当然是开源的asp.net mvc,但这对于本问题并不重要)。

应该使用什么数据库结构来帮助以最优性能检索论坛帖子?我没有把数字放进去,因为它可能会随着被检索的行数而变化。

此外,我应该能够将特定主题链接到其他主题。例如显示“相关论坛链接”。

我正在使用SQL Server 2005。

以下是我考虑的结构(毫不掩饰地从Stephen Walther的博客文章中借鉴):

表:Forum

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

表格:RelatedForum

· ForumId
· RelatedForumId

欢迎提出想法/建议。
提前致谢。

感谢所有的回复。我仍然会保持这个问题的开放,以获取更多的意见,并且我还有一些时间来最终确定整体设计。 - rajesh pillai
3个回答

3
当您考虑到最常见的使用情况是非递归自顶向下(论坛 -> 主题 -> 帖子)检索数据时,那么这个表结构是一个很好的起点,因为这将主要导致 WHERE ParentId = @SomeId 查询。
当您想要计算诸如“此论坛/主题中存在多少帖子?”之类的东西时,您很容易陷入无法确定哪些ID嵌套在哪些其他ID中(即缺少子关系)的境地。
您可以通过将 ThreadIdForumId 冗余保存到每个帖子中来解决这个问题。然后,您将能够询问 SELECT COUNT(*) FROM Postings WHERE ThreadId = @SomeId
对于给定帖子,这些ID不太可能发生变化,因此冗余不会立即创建插入/更新异常,但是如果您决定移动事物,则应该制定更新所有相关帖子的正确ID的过程。
对于更高级的将分层数据存储到RDBMS中的方法,您可以查看此问题的答案(这是我的,“没有钓鱼赞”意图):“将平面表解析为树的最有效/优雅方法是什么?”

这看起来真的很有趣。我会看一下这个的。 - rajesh pillai

1

数据表:文章

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

表格:线程

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

只有在具有缓存和索引的MySQL服务器上才能使用此结构。否则,这个结构并不是最好的选择,但是在使用了上述服务器后,可以轻松进行计数和全文搜索。


1
如果您能解释一下原因,那将会更有帮助! - eliego

1

看起来不错。我会把ParentThreadID改成ThreadID。添加ForumID也无妨,特别是为了计数目的。

你应该添加AuthorName。假设作者是你的用户表中的一个ID。现在获取该用户的姓名并附加上。这样,在显示主题或回复列表时,就不必再从用户表中查找50个名称了。同样,如果用户从系统中删除,您将无法再查找该名称。当然也不想从树中删除这些节点。


是的。作者是用户表中的ID。是的,我同意ThreadId这个名称。 - rajesh pillai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接