2009-02-20 99 views
2

我需要为论坛设计一个数据库。由于各种原因,我将根帖与其子帖子分开。我还需要用户输入的文字才能达到最佳搜索效果,从性能角度来看也是如此。如何设计数据库的问题答案(MySql)

我的问题,我应该(根柱和子柱)分隔每个表分成两个表:
根posts_meta(持有如身份证,创建时间,视图,数据....)
根-posts_data(id,title,body)用全文索引

与子帖子表相同的想法。

谢谢。

回答

0

由于InnoDB没有FULLTEXT支持,并且如果需要某种事务支持,那么这种分离是没有办法的。
mysql-fulltext

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

0

分离不会影响其可搜索性或搜索性能。如果这是你唯一关心的问题,那么你最好不要把它们当作一张桌子。

+0

和性能呢? – 2009-02-20 15:17:45

+0

我的意思是包含性能的可搜索性,但我已编辑澄清。 :) – chaos 2009-02-20 15:25:55

0

TEXT字段无论如何都存储在行外。

将表分隔将不会改善您的查询的准备性和性能。

你最好把它放在一张表中。

+0

啊哈,这里是其中的一个。如果我需要使用交易? – 2009-02-20 15:36:02

+0

据我所知,InnoDB现在也将TEXT字段存储在行外。 – Powerlord 2009-02-20 15:38:13

+0

InnoDB不支持FULLTEXT但是... – 2009-02-20 16:27:59

0

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

0

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

如果你想坚持根分离的分离,我认为你将通过进一步分离获得任何东西。

0

在常规论坛应用程序中,基本上根消息和子消息在本质上基本上是相同的东西。如果您确实想要获取有关新线程启动的特殊信息,则可能需要一个名为线程的单独表以及属于该线程的所有消息。消息本身对于根消息可以具有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 
0

正火差不多了,分割数据成小块,这将创建一个更好的设计。不幸的是,分开的表格意味着更多的连接和连接对性能不利。所以,你最终会取消规范化你的模式以提高性能。

我建议将这些东西放在同一张表中。

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

0

如果交易支持对您很重要,那么您仍然可以使用一个表格作为数据,并且可以使用类似Sphinx的全文搜索。