Mysql 一张桌子或两张桌子用于存储论坛';什么是线程和帖子?

Mysql 一张桌子或两张桌子用于存储论坛';什么是线程和帖子?,mysql,asp.net,normalization,forum,Mysql,Asp.net,Normalization,Forum,我正在用ASP.net和数据库MYSQL建立论坛网站 大家都知道,用户可以启动一个线程,其他人可以回复它 这是我实现的表 CREATE TABLE `a_post` ( `post_id_pk` int(10) unsigned NOT NULL AUTO_INCREMENT, `is_thread` tinyint(1) NOT NULL, `parent_thread_id` int(10) unsigned DEFAULT NULL, `title` varchar(100

我正在用ASP.net和数据库MYSQL建立论坛网站

大家都知道,用户可以启动一个线程,其他人可以回复它

这是我实现的表

CREATE TABLE `a_post` (
  `post_id_pk` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `is_thread` tinyint(1) NOT NULL,
  `parent_thread_id` int(10) unsigned DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `short_description` varchar(200) DEFAULT NULL,
  `description` text NOT NULL,
  `category_id_fk` tinyint(3) unsigned DEFAULT NULL,
  `user_id_fk` int(10) unsigned NOT NULL,
 ......
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
所以我使用一个表来存储线程和帖子。这种方法很有效。通常线程数小于posts数。或者我可以实现两个表来完成。一个用于存储线程,另一个用于存储具有相应线程Id的注释

什么是最好的?一张桌子还是管理两张桌子


我想要一个性能方面的答案。做论坛系统的人。这里是最受欢迎的。

一个线程可以有多个帖子,你可以考虑有两个表,一个是线程,一个是帖子。 还请记住,根据microsoft命名约定,表字段应为pascal大小写。因此,我建议您将模式更改为以下内容:

表[线程]

ID int
CreatedBy int
CreatedOn DateTime
Title nvarchar
CategoryID int
...
ID int
ThreadID int
CreatedBy int
CreatedOn DateTime
Body nvarchar
...
表格[ThreadPosts]

ID int
CreatedBy int
CreatedOn DateTime
Title nvarchar
CategoryID int
...
ID int
ThreadID int
CreatedBy int
CreatedOn DateTime
Body nvarchar
...
通过这样做,您可以避免数据重复,因为例如,当有人在某个线程上发送帖子时,您没有要填充的category_id,而字段保留为空。这可能是大型系统的性能问题

假设您想要获得一个线程的所有帖子。有两张桌子很容易:

var query = from thread in db.Threads
            join posts in db.ThreadPosts on thread.ID equals posts.ThreadID
            where thread.ID == threadID
            select new ThreadFullModel(){
                 Thread = thread,
                 Posts = posts
            };