如何为问答设计DB(MySql)

时间:2009-02-20 15:15:17

标签: mysql database database-design normalization

我需要为论坛设计一个数据库。由于各种原因,我将根帖与其子帖分开。从性能的角度来看,我需要用户输入的文本才能获得最佳搜索能力。

我的问题是,我应该将每个表(根帖和子帖)分成两个表:
root-posts_meta(保存id,创建时间,视图等数据) 以全文索引的root-posts_data(id,title,body)

与子帖子表相同的想法。

感谢。

8 个答案:

答案 0 :(得分:0)

分离不会影响其可搜索性或搜索性能。如果这是您唯一关心的问题,您也可以将每个人留作一张桌子。

答案 1 :(得分:0)

无论如何,

TEXT字段存储在行外。

分离表格既不会改善您的查询,也不会改善您的查询效果。

你最好把它放在一张桌子里。

答案 2 :(得分:0)

正如其他人所说,不要将表格分开。它没有任何好处,它实际上具有性能的缺点。添加另一个表意味着它只是在渲染页面时查询必须执行的另一个表连接。

答案 3 :(得分:0)

当我做了simmilar事情时,我将线程数据放在一个表中,并在其他表中发布数据(包括根帖)。在回答你的问题之前,我必须问你,你真的确定你需要将root和sub分开吗?

如果你想坚持使用root-sub分离,我认为你不会通过进一步分离它们来获得任何东西。

答案 4 :(得分:0)

基本上,根消息和子消息在常规论坛应用程序中本质上是相同的。如果您真的想要获得有关新线程开始的一些特殊信息,您可能希望有一个名为thread的单独表,以及属于该消息表中该线程的所有消息。对于根消息,消息本身可以具有null的parent_msg_id,或者如果它们是回复则可以具有另一消息的id。 像这样:

thread:
- thread_id
- started_ts
- author (long live redundancy!)
- other columns

message:
- message_id
- thread_id (reference to thread-thread_id)
- parent_msg_id (nullabel reference to message.message_id)
- body, author, timestamp etc

答案 5 :(得分:0)

规范化是将数据分成更小的部分,从而创建更好的设计。不幸的是,单独的表意味着更多的连接和连接对性能不利。因此,您最终会对模式进行反规范化,以便以后提高性能。

我建议将这些东西放在同一张桌子上。

如果它们真的完全不同,只是将它们放在不同的表中,而不仅仅是略有不同,或者你觉得分开它们会很好。

答案 6 :(得分:0)

由于InnoDB没有FULLTEXT支持,并且需要某种事务支持,因此无法解决这种分离问题。
mysql-fulltext

精心解释: InnoDB没有全文,MyIsam没有TX支持。 以SO为例。每个问题实体都有投票数,用户更新它,更改历史(在我的系统中我有很多其他的东西,让我们不要进入我所做的业务逻辑)。 其中许多字段必须在实体的生命周期内与其他表中的其他更改(即一个事务下的更改)一起进行更改,并且我需要对数据字段进行全文支持。

答案 7 :(得分:0)

如果事务支持对您很重要,那么您仍然可以使用一个表来获取数据,并使用Sphinx进行全文搜索。