【问题标题】:What's the optimal DB structure for a threaded forum?线程论坛的最佳数据库结构是什么?
【发布时间】:2008-12-12 08:30:28
【问题描述】:

我想为一个电子学习站点建立一个线程论坛(当然是开源的 asp.net mvc,尽管这对这个问题无关紧要)。

什么样的数据库结构才能帮助以最佳性能检索论坛帖子?我没有拒绝。到它,因为它可能会随着被检索的行数而变化。

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

我使用的是 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

表格:相关论坛

· ForumId
· RelatedForumId

欢迎提出想法/建议。

提前致谢。

【问题讨论】:

  • 感谢所有回复。我仍然会保留这个问题以获得更多意见,因为我还有一些时间来完成整体设计。

标签: database-design forum


【解决方案1】:

当您为最常见的用例考虑非递归自上而下(论坛 -> 线程 -> 发帖)检索数据时,此表结构是一个好的开始,因为这将主要导致 @ 987654322@查询。

当您希望能够计算诸如“此论坛/线程中存在多少帖子?”之类的事情时,您很容易陷入无法分辨哪些 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?"

【讨论】:

  • 这看起来真的很有趣。我会看看这个。
【解决方案2】:

表格:发布

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

表:线程

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

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

【讨论】:

  • 如果你能解释原因会更有帮助!
【解决方案3】:

看起来不错。我会简单地调用 ParentThreadID ThreadID。添加 ForumID 不会有什么坏处,尤其是出于计数目的。

您应该添加作者姓名。大概 Author 是您的 User 表的 ID。提取该用户的名称并立即附加它。这样可以省去在显示线程或响应列表时从用户表中查找 50 个名称的麻烦。同样,如果用户从系统中删除,您将无法再查找该名称。当然也不想从树中删除这些节点。

【讨论】:

  • 是的。作者是来自用户表的 ID。是的,我同意 ThreadId 名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2012-02-03
  • 2010-10-23
相关资源
最近更新 更多