2016-07-14 3 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

하나의 스레드는 여러 개의 게시물을 가질 수 있으므로 스레드와 게시물을위한 두 개의 테이블이 있다고 생각할 수 있습니다.

도 기억하십시오. 이중 명명 규칙 테이블 필드는 파스칼 케이스 여야합니다. 그래서 의해 내가 아래로 스키마를 변경하는 것이 좋습니다 :이 당신이 데이터 중복을 피하기를 수행하여

표 [스레드]

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

표 [ThreadPosts]

ID int 
ThreadID int 
CreatedBy int 
CreatedOn DateTime 
Body nvarchar 
... 

, 예를 들어 누군가가 스레드에서 게시물을 보낼 때 category_id가 채워지지 않고 필드가 비어 있기 때문입니다. 큰 시스템에서의 성능 문제 일 수 있습니다.

스레드의 모든 게시물을 가져오고 싶다고 생각해보십시오. 2 개의 테이블로 매우 편리합니다 :

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