Vous pouvez simplement utiliser une table, qui inclut un champ ParentID. Si l'enregistrement n'a pas de valeur, c'est un commentaire, sinon c'est une réponse (à un commentaire ou à une réponse).
Vous pouvez interroger l'enregistrement ParentID de l'enregistrement (inspectez c'est ParentID) pour voir si cette réponse concerne un commentaire ou une réponse.
Modifier :Ce qui précède est une solution assez pratique. Cependant, pour aller avec une version normalisée, conservez toujours la seule table Comments (sans ParentID) et créez une table ReplyTo qui a un CommentID et un ResponseID, qui sont tous deux les ID des enregistrements dans la table Comments.
En utilisant cette idée, le SQL suivant affichera les commentaires et la "réponse" à chaque commentaire pour chaque réponse contenant un commentaire :
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
Comme le souligne Dimitrii, il n'affichera pas de commentaires sans réponse - pour cela, vous avez besoin d'une requête de jointure externe (n'a pas testé la syntaxe) :
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