2016-07-14 26 views
-1

Ich baue Forum-Site mit ASP.net und DB ist MYSQL.Eine Tabelle oder zwei Tabellen zum Speichern von Forums Threads und Posts?

Wie Sie alle wissen, können Benutzer einen Thread starten und andere können darauf antworten.

Also hier ist die Tabelle, die ich implementiert habe.

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; 

Also verwende ich eine Tabelle, um sowohl Threads und Posts zu speichern. Dieser Ansatz funktioniert gut. Normalerweise ist die Anzahl der Threads kleiner als die Anzahl der Posts. Oder aber ich kann zwei Tabellen implementieren, ist zu tun. Eine besteht darin, Threads zu speichern, und eine andere besteht darin, Kommentare mit der entsprechenden Thread-ID zu speichern.

Was ist das Beste? Eine Tabelle oder zwei Tabellen verwalten?

Ich möchte eine Antwort mit Leistung weise. Leute, die Forum-Systeme gemacht haben. Sie sind hier herzlich willkommen.

Antwort

0

Ein Thread kann mehrere Posts haben und Sie könnten zwei Tabellen haben, eine für Threads und eine für Posts.

auch daran erinnern, dass Duo zu Microsoft Namenskonventionen Tabelle Feld Pascal Fall sein sollte. so durch, dass ich schlage vor, Sie Schema unten zu ändern:

Tabelle [Themen]

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

Tabelle [ThreadPosts]

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

indem Sie diese Daten Doppelarbeit vermeiden, Wenn zum Beispiel jemand einen Beitrag zu einem Thread sendet, haben Sie keine category_id zum Ausfüllen und das Feld ist leer. das könnte das Leistungsproblem auf größeren Systemen sein.

betrachten Sie möchten alle Beiträge eines Threads erhalten. es ist so einfach mit zwei Tabellen:

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