在数据库中存储论坛主题和回复的最佳方法

时间:2009-02-15 22:14:13

标签: database-design

在架构设计方面,论坛似乎是一个有趣的项目。

我想知道,要获得一个包含开头帖子和回复的记录集,最好的方法是什么?我可以将所有线程(第一个,开放帖子)存储在一个表中,并有一个包含回复的表。然后我可以使用适当的连接来获得与线程匹配的回复表中的所有回复(例如pk / fk之间的唯一键匹配)。然后,我可以根据回复数据对此表进行排序,以获得上一篇文章的开头。这会是一个观点还是临时表?为什么?

或者,我可以将所有内容存储在一个表中,并使用递归来获取数据。这有点复杂吗?

最好的方法是什么?或者也许有更好的方法呢?

谢谢

7 个答案:

答案 0 :(得分:3)

在数据库中存储分层数据之前已在SO上解决了几次。 Here is one of the more comprehensive responses

答案 1 :(得分:2)

我喜欢使用可以为空的InReplyTo列的单表方法。

就像两个表方法一样,因为帖子和回复共享如此多的结构,有两个几乎相同的表是一种耻辱。这导致了第三种可能性......

有一个带有公共元素的“Message”表和一个“References”表来显示各个消息之间的关系。

答案 2 :(得分:0)

我曾经把这作为面试问题。

我想我说它取决于性能,可维护性和其他标准,这是正确的方法,但我选择了多表方法。
(线程,消息等)

可悲的是,我从来没有得到这份工作。所以你可能想要采用更复杂的方法 但是我仍然认为正确的答案是,这取决于。

答案 3 :(得分:0)

一种简单的方法是将所有论坛帖子存储在一个表中,如下所示:

| id | parent_post | post_content | user | timestamp |

显然简化了一点,因为对于大多数论坛你也想存储数据,比如它发布的IP地址等等。然后要显示一个帖子,你需要做的只是

SELECT post_content,user [...] FROM posts WHERE 
    parent_post = $id ORDER BY timestamp; 

这是伪代码/简化,但你明白了。

编辑:我假设您正在谈论一个标准论坛,它通常是一个主要帖子,其他帖子都是主帖的“孩子”。如果你想设计这个以允许嵌套的回复,比如一个线程的usenet / email对话,那么显然我不会采用这种方法!

答案 4 :(得分:0)

Joe Celko有一本关于如何在SQL中表示树结构的书。这是我在这个主题上看到的最权威的指南。谷歌搜索Joe Celko和树木shoudl找到他的一些关于这个主题的在线文章。

答案 5 :(得分:0)

我同意杰伊

| id | parent_post | post_content | user | timestamp |

但要获得整个线程,您还需要某种Path或Sequence列,以逻辑顺序显示帖子。

我们倾向于使用两者 - 可以拆分路径以提供层次结构的父级。对给定线程有效的附加Sequence列可以用作简单的ORDER BY来检索线程顺序中的帖子 - 但是当线程中的其他帖子之间插入回复时,它可能需要经常更新。 / p>

出于这个原因,我会将它放在另一个表格中 - 与帖子表格保持1:1的关系。

答案 6 :(得分:0)

存储“父帖”的问题在于,在渲染时必须重复扫描数据集。

鉴于论坛的呈现方式往往比修改后更多,您应优化读取,而不是写入。

一种奇妙的方法称为嵌套集。这种方法对选择有很多性能改进,包括能够非常容易地拉回和渲染子树。

我之前使用过BetterNestedSet for Ruby on Rails。这个想法很简单,你可以自己实现它。