我想为电子教学网站建立一个线程论坛(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
欢迎提出意见/建议。
提前致谢。
答案 0 :(得分:2)
如果你有一个非递归的自上而下(论坛 - >线程 - > Postings)检索你的数据为最常见的用例,那么这个表结构是一个好的开始,因为这主要是在WHERE ParentId = @SomeId
个查询中。
如果您希望能够计算“此论坛/主题中存在多少个帖子?”之类的内容,您将很容易陷入无法判断哪些ID嵌套到哪个其他ID(即儿童关系不见了。)
您可以通过在每个帖子中冗余保存ThreadId
和ForumId
来解决这个问题。然后你就可以问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个名称的麻烦。同样,如果用户从系统中删除,则无法再查找该名称。当然不想从树中删除这些节点。