你会如何设计论坛的数据库架构?

13

我正在练习搭建一个小型论坛。我发现像phpBB这样的论坛将帖子文字存储在单独的表中。

为什么?为什么不把它全部存储在同一张表中呢?

例如:thread_id,thread_date,thread_text,thread_author

为什么要这样做?你会怎么做?


1
我不同意,这个话题在这里和其他网站上已经广泛讨论过了。 http://stackoverflow.com/questions/548793/a-good-tutorial-on-creating-a-php-forum-from-scratch/548810#548810 - barfoon
@barfoon,这不是关于创建论坛的问题,他想知道为什么phpBB会做它所做的事情。我认为这是一个好问题。现在如果他问,“建立一个论坛的最佳方式是什么”,我会同意你的观点。 - Malfist
“你认为什么是最好的方式?”听起来并不特定于phpBB。 - barfoon
7个回答

19

我在网上找到这个很酷的模式。

schema
(来源:yensdesign.com)

对于任何基本论坛的数据库模式,这似乎是一个不错的起点。

我知道这很老了,但我想为那些再次找到这个问题的人发帖。


2
链接已失效。 - good_afternoon

5
我其实不知道为什么要这样做,但我可以想象一个原因是为了优化帖子元数据(日期、作者等)的搜索和检索。根据Joel的说法(而Joel总是正确的!;-)),数据库将其数据存储在由固定长度字段组成的固定长度记录中,因此只需通过增加指针的字节长度即可轻松地从一行跳转到下一行。但用于存储帖子文本的大型文本字段不能具有固定大小,因为帖子的长度变化范围很大,创建足以容纳所有帖子的固定长度存储将浪费大量空间。这意味着将帖子文本存储在与其他信息相同的表中,在检索大量帖子的元数据时会使它变得更慢,就像每次有人查看主要论坛页面时所做的那样。同时,将固定长度字段(即除了帖子文本以外的所有内容)放在一个表中,将可变长度字段(即帖子文本)放在另一个表中,可以兼顾两者的优点。

这可能对某些(比如说“遗留”或“原始的”)DBMS是正确的,但对于大多数现代DBMS来说几乎不可能 - http://www.postgresql.org/docs/current/static/storage-toast.html。 - Milen A. Radev

3

我从未深入了解过phpBB的内部结构,但可能是因为使用了全文索引。主表使用Inno-db引擎以允许事务处理等操作。而MyIsam则用于全文索引。


1
嗯...phpBB,至少在3.0版本之前,所有表格都使用MyISAM。 - Brian Neal

3

首先,大部分关系数据库的文件系统布局是这样的,存储任意文本或数据块过大会拖慢系统速度。由于数据通常按行存储,因此在搜索时,即使查找无关字段,数据库现在也必须跳过可变长度文本字段。

其次,将所有内容都放在一个表中会使后续需要添加数据模型变得更加困难,例如如果您需要为每个thread_id添加更多数据。

良好的数据库设计需要一些教育。您应该从http://en.wikipedia.org/wiki/Database_normalization开始。务必了解第三范式(3NF)。


2

InnoDB 不支持 FULLTEXT 索引,而 MyISAM 不支持事务。

我不了解 phpBB,但可能是因为他们将表格分开的原因。


1

由于表格的大小限制,他们不会将文本存储在同一张表中。

这样做的好处是,即使有大量的条目,线程列表表格仍然很小,索引良好,并且扫描速度快。只有在需要时才会访问文本,使用一个快速的主键。

对于小型论坛来说,我认为这并不是必要的,因为编码开销很小。


1
TEXT列在两个引擎中都是存储在行外的,对表格大小几乎没有影响。 - Quassnoi
我同意--我认为Mario的解释是正确的。 - Jeff Atwood

1
除了Julien的出色回答之外,将帖子移动到其他主题中(由管理员或版主)是非常常见的。在“帖子表”中拥有文本有助于支持此操作。

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