2010-05-28 8 views
6

Ich möchte etwas wie reddit erstellen, wo sie Kommentare haben, dann antwortet auf den Kommentar, dann antworten Sie auf die Antwort.Wie antworte ich auf Kommentare? (PHP)

Welche Art von Datenbank-Struktur verwenden sie so:

1. they keep track of all the comments to a posting 
2. a reply to a comment 
3. a reply to a reply 

Alles, was ich recht habe, ist nur ein Posting und eine Reihe von Kommentaren, um es im Zusammenhang wie ..

POSTING TABLE 
posting_id | title | author 

COMMENTS TABLE 
comment_id | posting_id | comment 

REPLIES TABLE 
???? 

Wie Ich verweise die Kommentare auf die Antworten? Welche Art von CSS verwenden sie, um Antworten auf eingerückten Speicherplatz zu geben?

EDIT: Danke für die Antworten! Jetzt meine einzige Frage, wie kann ich die Antworten einrücken? Wie ..

you like food 
    yes I love italian 
     Yes i do like it too 
    chinese is best 

Antwort

6

Sie können eine andere Spalte auf Ihre Kommentare Tabelle hinzufügen parent_comment_id angeben, wo Sie es mit der ID des Kommentars (oder Antwort) bevölkern den Benutzer ist die Beantwortung. In dem Fall, in dem der Kommentar eine direkte Antwort auf den Post ist (keine Antwort auf einen Kommentar), wäre diese Spalte null.

+3

Genau: Kommentare sind Kommentare, ob sie Antworten auf andere Kommentare sind oder nicht. –

+0

Sorry, ich bin so langsam. Ich hab es geschafft! Vielen Dank. Jetzt meine Frage ist, wie füge ich die Antworten ein? Würde ich irgendeine Art von Beziehung kennen müssen? Wie diese Antwort ist die erste, diese Antwort ist 2. so Einzug x2, diese Antwort ist 3., so IDENTX3 – jpjp

+0

@jpjp: Ich würde dies auf der Anwendungsebene tun. Wenn Sie den Baum der Kommentare erstellen, wissen Sie viel, um sie einzurücken. Nur noch eins als Elternteil. –

0

Fügen Sie Ihrer Kommentartabelle ein weiteres Feld hinzu, das "reply_to" oder etwas ähnliches, und speichern Sie die ID des Kommentars, auf den sie antwortet.

0

könnten Sie die Kommentar Tabelle generic machen wie so:

COMMENTS TABLE 
comment_id | posting_type | posting_id | comment 

wo posting_type eine Art von Unterscheidungs ​​ist, zum Beispiel eine Zeichenfolge ‚POST‘ oder ‚KOMMENTAR‘, oder eine ganze Zahl für mehr Effizienz (1 = POST , 2 = KOMMENTAR usw.).

bearbeiten: zugegebenermaßen ist dies komplizierter, aber es bedeutet, dass Sie die gleiche Kommentar-Tabelle für Kommentare zu nichts, nicht nur Beiträge und andere Kommentare verwenden können.

+0

Ihnen fehlt die Beziehung zum "Eltern" -Kommentar. –

+0

Nein, weil posting_type dann COMMENT und posting_id die ID des übergeordneten Kommentars ist. – oedo

+0

Dies bricht eine Pseudo-FK-Konvention. Auch in diesem Fall konnten Sie der Tabelle keinen FK hinzufügen, da sich die posting_id jetzt auch auf sich selbst bezieht. –

0

Sie benötigen die Antworttabelle nicht. Wie andere bereits richtig angemerkt haben, ist Rekursion der Weg zu einem RDBMS. Sie könnten immer ein DBMS im Nosql-Stil verwenden, um Rekursionen zu vermeiden.

1

Ich würde das tun, indem Sie eine Querverweistabelle machen.

Beispiel:

Tabelle: Beiträge

Columns: pstkey | userid | postMessage | etc...

pstkey ist der Schlüssel für den Posten Körper. Benutzer-ID ist die Person, die den Beitrag erstellt hat. postMessage ist der eigentliche Posteintrag.

Tabelle: Kommentare

Columns: comkey | pstkey | userid | commentMessage | etc...

COMKey der Schlüssel für die gemacht Kommentar. Bezug auf den Post mit dem PSTKey. Benutzer-ID ist die Person, die den Kommentar abgegeben hat. und dann commentMessage ist der Text des eigentlichen Kommentars.

Tabelle: xref_postComm

Columns: xrefkey | pstkey | comkey | comkey2 |

Nun zum spaßigen Teil. Alle Posts gehen in die Post-Tabelle. ALLE Kommentare gehen in die Kommentartabelle. Die Beziehungen sind alle in der Kreuzreferenztabelle definiert.

Ich mache alle meine Programmierung auf diese Weise. Ich hatte das Privileg, mit einem der weltweit besten Datenbankingenieure zu arbeiten, der im Ruhestand war, und er brachte mir ein paar Tricks bei.

Wie die Querverweistabelle verwenden:

xrefkey | pstkey | comkey | comkey2 
All that you look for is the population of a given field. 

xref (Auto Incremented) 
pstkey (Contains the pstkey for the post) 
comkey (Contains the comkey for the comment post) 
comkey2 (Contains the comkey for the comment post) 
     (but only populate comkey2 if comkey already has a value) 
and of course you populate comkey2 with the key of the comment. 

SEE, no reason for a 3rd tabel! 

With this method you can add as many relationships as you want. 
Now or in the future! 

comkey2 ist Ihre Antwort auf eine Antwort. Wo diese einzelne Zeile enthält ... den Schlüssel des Posts, den Schlüssel des Kommentars und den Schlüssel der Antwort auf den Antwortkommentar. Alles getan durch Bevölkerung von Xref.

 
EXAMPLE: 
PAGES.... Page table 

POSTS 
pstkey | pageid | user| Post 
------------------------------------- 
| 1 | 1 | 45 | Went to the store the....| 
| 2 | 2 | 18 | Saw an apple on tv..... 

COMMENTS 
comkey | pstkey | user | Comment 
----------------------------------------------- 
| 1 | 1 | 9 | Wanted to say thanks... 
| 2 | 1 | 7 | Cool I like tha..... 
| 3 | 2 | 3 | Great seeing ya.... 
| 4 | 2 | 6 | Had a great.... 
| 5 | 2 | 2 | Don't sweat it man... 

xref_PostCom 
xrefkey | pageid | pstkey | comkey | comkey2 | 
---------------------------------------------- 
| 1 | 1 | 1 | NULL | NULL | Post1 on Page1 
| 2 | 1 | 1 | 1 | NULL | Comment1 under Post1 
| 3 | 1 | 1 | 2 | NULL | Comment2 under Post1 
| 4 | 2 | 2 | NULL | NULL | Post2 on Page2 
| 5 | 2 | 2 | 3 | NULL | Comment3 under Post2 on Page2 
| 6 | 2 | 2 | 4 | NULL | Comment4 under Post2 on Page2 (a second Comment) 
| 7 | 2 | 2 | 4 | 5 | Explained below.... 
Comment key 5 is matched with comment key 4....under post2 on Page 2 

Wenn Sie etwas wissen über beitreten, verbinden sie nach links, rechts kommen, innen/außen zu schaffen join SELECT ist die Datenfelder unter Verwendung dieser Beziehungen zu bekommen, Ihre Arbeit wird sehr viel einfacher.

Ich glaube der Ingenieur nennt dies im Grunde "die Datenkarte" von definierten Beziehungen. Der Trick besteht nun darin, wie Sie mit diesen Beziehungen auf sie zugreifen. Zuerst fällt es schwer, aber weiß, was ich weiß, ich weigere mich, es anders zu machen.

Was am Ende passiert ist, dass Sie am Ende schreiben 1 Skript, das sagt, ok, geh, uhh, alles und komm zurück. Sie werden mit 1 Funktionsaufruf enden, der nach Seite 1 fragt. Er kehrt mit page1, post 1, comment1 3 und den Antworten auf die Antwort in 1 Array zurück. Echo zur Ausgabe und fertig.

UPDATE FÜR KOMMENTAR Ich sagte die gleiche genaue Sache beim ersten Mal wurde mir gezeigt. Tatsächlich machte es mich wirklich wütend, dass der Datenbankprogrammierer mich dazu zwang, es so zu machen. Aber jetzt verstehe ich es. Die Vorteile sind so viele.

Vorteil 1) 1 Abfrage geschrieben werden kann, um alles in 1 Schuss zu ziehen.

2) Antworten in mehreren Abfragen können Arrays in einer Struktur auffüllen, die beim Drucken der Seite eine Schleife in einer Schleife anzeigen kann.

3) Das Aktualisieren Ihrer Software, die es verwendet, kann jede mögliche Designänderung unterstützen, die Sie jemals denken können. Makellose Erweiterbarkeit.

Der Typ, der es mir beigebracht hat, war der Angestellte, der Sears und Jpenny-Datenbanken neu gestaltete. Zurück, als sie 9 Bücher zum selben Haus wegen doppelter Datensätze Ausgaben hat.

Querverweistabellen verhindern viele Probleme im Design.

Das Herz zu dieser Theorie ist, kann eine Spalte nicht nur Daten enthalten, sondern dienen gleichzeitig als eine wahre oder falsche Aussage. Das in sich selbst spart Platz. Warum 20 Tabellen durchsuchen, wenn Sie eine suchen können? Eine indizierte Querverweistabelle kann Ihnen alles erzählen, was Sie über die anderen 20 Tabellen wissen müssen, was Sie brauchen, was Sie nicht brauchen und müssen die andere Tabelle überhaupt öffnen.

kurz: 1 Querverweis nichts anderes als INT enthält (2/11), dass Sie alles, was Sie wissen müssen, erzählt, bevor Sie jemals einen anderen Tisch öffnen, enthält nicht nur einwandfreie Erweiterbarkeit aber blitzschnell Ergebnisse. Ganz zu schweigen von der Möglichkeit doppelter Datensätze. Für Sie und mich sind doppelte Datensätze möglicherweise kein Problem. Aber zu Sears mit 4 Milliarden Rekorde bei $ 11 ein Buch, addieren sich Fehler.

+0

Können Sie sagen, was ist der Vorteil davon? Alles was ich sehe ist, dass ich mehr Joins machen muss ... –

2

Um Antworten innerhalb von Antworten anzuzeigen, müssen Sie einen rekursiven Aufruf ausführen, um die Unterantworten zu generieren.

So etwas wie

function get_comments($comment_id) { 
    print '<div class="comment_body">'; 

    // print comment body or something? 

    if (comment_has_reply($comment_id)) { 
     foreach(comment_comments($comment_id) as $comment) { 
      get_comments($comment->id); 
     } 
    } 

    print '</div>'; 
} 

Um indent Kommentare jedoch CSS.

<style type="text/css"> 
.comment_body { 
    margin-left:10px; 
} 
</style> 

Auf diese Weise werden Unterantworten mehr eingerückt als die Eltern, und ihre Subs werden noch mehr eingerückt, und so weiter.

Verwandte Themen