我正在建立一个练习的小论坛。我看到像phpBB这样的论坛将线程文本存储在一个单独的表中。
为什么呢?为什么不将它们全部存储在同一个表中?
类似于:thread_id, thread_date, thread_text, thread_author
为什么这样做?你会怎么做?
答案 0 :(得分:11)
我在网上发现了这个很酷的架构。
schema http://yensdesign.com/tutorials/forumsdatabase/schemaFull.jpg
对于任何基本论坛的数据库架构来说,似乎都是不错的首选。
我知道这已经过时了,但我想这会发布给那些会再次发现这个问题的人。
答案 1 :(得分:5)
我实际上并不知道为什么会这样做,但我可以想象的一个原因是优化后期元数据(日期,作者等)的搜索和检索。
According to Joel(和Joel永远是对的!;-)数据库将数据存储在组成固定长度记录的固定长度字段中,因此只需通过递增指针就可以轻松地从一行跳到下一行。记录的字节长度。但是用于存储帖子文本的大文本字段不能具有固定的大小,因为帖子的长度变化很大,并且创建足够大的固定长度存储以容纳所有帖子会浪费大量空间。这意味着将帖子文本存储在同一个表中,因为当您想要检索大量帖子的元数据时,其他信息会使它变得慢得多,就像每次有人查看主论坛页面时那样。
充分利用两个世界的方法是将固定长度的字段(即除了帖子文本之外的所有字段)放在一个表中,将可变长度字段(即后置文本)放在另一个表中。
答案 2 :(得分:3)
从来没有看过phpBB的内部,但是因为全文索引而感到愤怒。 Inno-db引擎为主表允许事务而不是什么。 MyIsam用于全文索引。
答案 3 :(得分:3)
首先,大多数关系数据库的文件系统布局使得存储大块任意文本或数据会使系统变慢。由于数据通常按行存储,因此在进行搜索时,数据库现在必须跳过可变长度的文本字段,即使在查找不相关的字段时也是如此。
其次,如果您需要为每个thread_id提供更多数据,那么将所有内容放在一个表中会使得以后添加到数据模型变得更加困难。
设计数据库模式需要一些教育。您应该从http://en.wikipedia.org/wiki/Database_normalization开始。一定要了解第三范式。
答案 4 :(得分:2)
InnoDB
不支持FULLTEXT
索引,MyISAM
不支持交易。
不知道phpBB
,但可能这就是他们将表分开的原因。
答案 5 :(得分:1)
由于表格的大小,它们不会将文本存储在同一个表中。
这样,即使条目数量非常大,线程列表也很小,索引很好,扫描速度很快。只有在必要时才使用主键访问文本,主键也很快。
对于小论坛,我认为这不是必需的,因为有一点编码开销。
答案 6 :(得分:1)
除了Julien的优秀答案之外,将帖子移动到其他线程(通过管理员或主持人)是很常见的。将文本放在“帖子表”中有助于支持这一点。