2016-07-14 113 views
-1

我用ASP.net构建论坛网站,DB是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; 

所以我使用一个表来存储线程和帖子。这种方法工作正常。通常线程数比帖子数少。否则我可以实现两个表来做。一个是存储线程,另一个是存储注释与相应的线程ID。

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

我想要一个性能明智的答案。做过论坛系统的人。你在这里最受欢迎。

回答

0

一个线程可以有多个帖子,由此你可能会考虑有两个表,一个用于线程,另一个用于发帖。

还记得,对微软命名约定表字段应该是pascal的情况。所以由我建议您模式更改为以下:通过这样做,你避免数据重复

表[主题]

ID int 
CreatedBy int 
CreatedOn DateTime 
Title nvarchar 
CategoryID int 
... 

表[ThreadPosts]

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 
      };