2012-11-21 18 views
5

Voglio creare due tabelle una con commenti e un'altra con risposte, con una relazione uno a molti tra di loro. Ma cosa succede se possono anche rispondere alle risposte, come dovrebbe essere cambiato allora? Questo è quello che ho per uno a molti, ma non so come dovrebbe apparire se ci possono essere anche risposte per una risposta.Progettazione database per commenti e risposte

Comments: 
• Id 
• Title 
• Text 

    Replies: 
• Id 
• Title 
• Text 
• Comment id 

Grazie in anticipo.

+0

Il design è normalizzato, è possibile procedere con esso. Dovresti avere un ID utente che sarà l'id del creatore in entrambe le tabelle. In secondo luogo, Reply for a Reply è uno scenario logico, l'implementazione è come se avessi uno stato in cui le persone rispondono –

+0

UserId? Dove si riferisce l'utente? – mcalex

risposta

11

Si potrebbe semplicemente utilizzare una tabella, che include un campo ParentID. Se il record non ha valore, è un commento, altrimenti è una risposta (a un commento o una risposta).

È possibile richiedere il record ParentID del record (controllare è ParentID) per vedere se questa risposta è relativa a un commento o una risposta.

Modifica: Quanto sopra è una soluzione abbastanza pratica. Tuttavia, per andare con una versione normalizzata, mantenere ancora la tabella dei commenti (senza ParentID), e creare una tabella ReplyTo che abbia un ID commento e un ResponseID, che sono entrambi gli ID dei record nella tabella Commenti.

Usando questa idea, il seguente SQL mostrerà i commenti e la 'risposta' ad ogni commento per ogni risposta che ha un commento:

select c.comment, r.comment as reply 
from comment as c, comment as r, replyto as rt 
where c.ID = rt.CommentID 
and r.ID = rt.ReplyID 

Come Dimitrii fa notare, non visualizzerà commenti con nessuna risposta - per questo è necessaria una query outer join (non testata la sintassi):

SELECT c.comment, r.comment as reply, 
from Comment c 
    left outer join Comment r on c.id = r.id 
    left outer join replyto rt on rt.responseid = r.id 
+0

Può, ma il suo design è più normalizzato ... –

+1

Sono d'accordo con mcalex. Dividerlo su 2 tavoli sembra inutilmente complesso senza alcun beneficio. Se esiste un caso per dividerlo su più tabelle per motivi di normalizzazione, allora avere una tabella di thread e quindi una tabella di commenti (sia il commento originale che le risposte). Tuttavia, normalmente, richiederà chiamate ricorsive al database per ottenere risposte, quindi risposte alle risposte, ecc. Può essere fatto utilizzando il modello di serie nidificato. – Kickstart

+0

grazie alex, penso che entrambe le soluzioni funzioneranno bene, ma nella tua esperienza quale pensi che fornirà prestazioni complessive migliori? – grasshopper

Problemi correlati