3

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

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

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

我正在使用 SQL Server 2005。

以下是我想到的结构(无耻地取自) Stephen Walther 优秀的博文

表:论坛

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

表:相关论坛

· ForumId
· RelatedForumId

欢迎提出想法/建议。

提前致谢。

4

3 回答 3

3

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

当您希望能够计算诸如“该论坛/线程中存在多少帖子?”之类的事情时,您很容易陷入无法分辨哪些 Id 嵌套在其他 Id 中的情况(即子关系是失踪)。

您可以通过冗余保存ThreadIdForumId写入每个帖子来解决这一问题。那你就可以问了SELECT COUNT(*) FROM Postings WHERE ThreadId = @SomeId

对于给定的帖子,这些 ID 不太可能更改,因此冗余不会立即创建插入/更新异常,但您应该有一个适当的程序来使用正确的 ID 更新所有相关的帖子,以防您决定移动内容.

对于将分层数据存储到 RDBMS 中的更高级方法,您可以查看这个问题的答案(这是我自己的,“没有钓鱼投票”的意图):“解析平面表的最有效/优雅的方法是什么到树上?”

于 2008-12-12T08:48:57.653 回答
1

表:帖子

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

表:螺纹

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

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

于 2008-12-12T08:54:34.787 回答
1

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

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

于 2008-12-12T09:19:57.153 回答