您将如何构建论坛的数据库架构? [关闭]

Posted

技术标签:

【中文标题】您将如何构建论坛的数据库架构? [关闭]【英文标题】:How would you structure a forum's DB schema? [closed] 【发布时间】:2009-02-20 20:51:31 【问题描述】:

我正在建立一个练习用的小论坛。我看到像 phpBB 这样的论坛将主题文本存储在单独的表格中。

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

类似:thread_id, thread_date, thread_text, thread_author

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

【问题讨论】:

我不同意,这个话题已经在这里和其他网站上广泛讨论过。 ***.com/questions/548793/… @barfoon,这不是关于创建论坛,他想知道为什么 phpBB 会这样做。我认为这是一个很好的问题。现在,如果他问,建立论坛的最佳方式是什么,我会同意你的看法。 “你认为最好的方法是什么?”听起来并不特定于 phpBB。 【参考方案1】:

我在网上找到了这个很酷的架构。

(来源:yensdesign.com)

对于任何基本论坛的数据库架构来说似乎都是不错的入门。

我知道这是旧的,但我想我会为任何会再次找到这个问题的人发布这个。

【讨论】:

链接失效【参考方案2】:

我实际上不知道为什么要这样做,但我可以想象的一个原因是优化帖子元数据(日期、作者等)的搜索和检索。

According to Joel(Joel 永远是对的!;-) 数据库将其数据存储在由固定长度记录组成的固定长度字段中,因此只需将指针递增一个字节就可以轻松地从一行跳转到下一行一条记录的长度。但是用于存储帖子文本的大文本字段不能具有固定大小,因为帖子的长度在很大范围内变化,并且创建足够大以容纳所有帖子的固定长度存储将浪费大量空间。这意味着当您想要检索大量帖子的元数据时,将帖子文本与其他信息存储在同一个表中会大大降低速度,就像每次有人查看主论坛页面时所做的那样。

两全其美的方法是将固定长度字段(即除帖子文本之外的所有内容)放在一个表中,将可变长度字段(即帖子文本)放在另一个表中。

【讨论】:

这对于某些(比如“遗留”或“原始”)DBMS 来说可能是正确的,但对于大多数现代 DBMS 来说几乎是这样 - postgresql.org/docs/current/static/storage-toast.html【参考方案3】:

从来没有看过 phpBB 的内部,但也许是因为全文索引。主表的 Inno-db 引擎允许事务和不允许事务。 MyIsam 用于全文索引。

【讨论】:

嗯...phpBB,至少在 3.0 之前的版本中,所有表都使用了 MyISAM。【参考方案4】:

一方面,大多数关系数据库的文件系统布局使得存储大块任意文本或数据会降低系统速度。由于数据通常按行存储,因此在进行搜索时,即使在查找不相关的字段时,数据库现在也必须跳过可变长度的文本字段。

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

很好地设计数据库模式需要一些教育。您应该从http://en.wikipedia.org/wiki/Database_normalization 开始。一定要了解第三范式。

【讨论】:

【参考方案5】:

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

不知道phpBB,但可能这就是他们分开表格的原因。

【讨论】:

【参考方案6】:

由于表格可以达到的大小,它们不会将文本存储在同一个表格中。

这样,即使有非常多的条目,线程列表表也很小,索引很好,并且扫描速度很快。仅在必要时使用主键访问文本,这也很快。

对于小型论坛,我认为这没有必要,因为有一点编码开销。

【讨论】:

TEXT 列在两个引擎中都存储在行外,对表大小几乎没有影响。 我同意——我认为马里奥的解释是正确的【参考方案7】:

除了 Julien 的出色回答之外,将帖子移动到其他线程(比如管理员或版主)是很常见的。将文本放在“post table”中有助于支持这一点。

【讨论】:

以上是关于您将如何构建论坛的数据库架构? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

LNMP架构部署Discuz论坛

企业如何高效用云?| 资深运维架构师细说云架构下的运维体系构建

数据访问层应该如何构建?

elasticsearch 搭配 canal 构建主从复制架构实战

专家观点 | 郭涛:银行分布式架构的发展与实践

搭建LNMP架构论坛