Ich habe ein Skript, das ich geschrieben habe, während ich zurück für Kommentare, aber es ist nur single-threaded. Ich möchte, dass es multi-threaded ist, aber nur so kann ein Benutzer auf einen Kommentar antworten, nicht so, dass ein Benutzer auf einen Kommentar eines Kommentars antworten kann. Also wären die Threads nur zwei tief.
Momentan speichere ich ein comment_id
gegen ein user_id
in meiner Datenbank.
Ich kann mir nur die multi-threaded-Kommentare vorstellen, indem ich ein parent
-Feld in der Kommentartabelle habe. Aber wenn ich das tue, wenn ich die Kommentare mit PHP auswähle, muss ich einen weiteren SELECT-Befehl ausführen, um die Kommentare für Kinder (falls vorhanden) für jeden Kommentar auszuwählen. Scheint so viel Arbeit an der Datenbank.
Es muss einen besseren Weg geben. Irgendwelche Ideen dazu? Oder Tutorials?
Es gibt drei (vier) alternative Möglichkeiten:
Eine rekursive Abfrage , um alle Kommentare basierend auf ihren übergeordneten IDs auszuwählen. Dies wird von vielen Datenbankprodukten unterstützt und die Syntax hängt vom Datenbanktyp ab. Überprüfen Sie die Dokumente für weitere Informationen (suchen Sie nach 'rekursiv').
Wenn Sie die Artikel-ID in jedem (Teil-) Kommentar speichern, können Sie alle Kommentare mit der Artikel-ID in einer regulären Auswahlabfrage auswählen. Sie können die übergeordneten IDs verwenden, um die Kommentare auf der Seite unter dem richtigen übergeordneten Kommentar korrekt anzuzeigen:
%Vor%Wenn Sie nur zwei Ebenen von Kommentaren benötigen, können Sie einen erweiterten where verwenden, um Kommentare der ersten und zweiten Ebene einzubeziehen:
%Vor%Es ist auch möglich, union all zu verwenden, um zwei Abfragen mit denselben Spalten zu kombinieren, aber da ich davon ausgehe, dass alle Daten aus derselben Tabelle stammen, ist dies wahrscheinlich nicht nötig (siehe der erweiterte Where-Klausel oben):
%Vor%Persönlich würde ich für Option 2 gehen, weil es einfach ist (kein exotisches SQL-Konstrukt erforderlich), effizient (1 Abfrage) und flexibel (unterstützt so viele Ebenen von Kommentaren, wie Sie möchten).
Dies wird häufig für hierarchische Daten oder Baumstrukturdaten verwendet. Ich habe eine beliebte Antwort auf diese Frage zu Stack Overflow geschrieben: Was ist der effizienteste / eleganteste Weg, einen flachen Tisch in einen Baum zu zerlegen?
Ich habe auch eine Präsentation geschrieben, die Alternativen für baumstrukturierte Daten beschreibt: Modelle für hierarchische Daten mit SQL und PHP .
Eine andere Lösung, die nicht in meiner Präsentation enthalten ist, ist die Art und Weise, wie Slashdot Kommentare in Threads ausführt. Sie verwenden eine parent
-Spalte wie Sie, sodass jeder Kommentar auf den Kommentar verweist, auf den er antwortet. Aber sie enthalten auch eine Spalte root
, so dass jeder Kommentar den Post kennt, zu dem er gehört. Es gibt selten mehr als ein paar hundert Kommentare zu einem bestimmten Beitrag, und normalerweise möchten Sie den gesamten Baum mit Kommentaren für einen bestimmten Beitrag abrufen, der am Anfang des Kommentarthreads beginnt:
Wenn Sie die Kommentare abrufen, können Sie PHP-Code schreiben, um sie in Arrays von Arrays gemäß den parent
-Spalten zu verarbeiten (dies ist die Antwort von @ JanL). Ich habe einen Code gepostet, um dies in meiner Antwort auf eine andere Stack Overflow-Frage zu tun, Konvertieren Sie ein flaches Array in das multidimensionale .
Tags und Links sql php mysql comments hierarchical-data