Frage

Ich entwickle eine Web-Anwendung, die Gewinde Kommentare unterstützen kann. Ich brauche die Möglichkeit, die Kommentare über die Anzahl der Stimmen basierend neu zu ordnen. (Identisch mit, wie Gewinde Kommentare Arbeit in reddit )

Ich würde gerne die Eingänge von der SO-Community zu hören, wie es zu tun.

Wie soll ich entwerfen, um die Kommentare Tabelle? Hier ist die Struktur ich jetzt benutze:

Comment
    id
    parent_post
    parent_comment
    author
    points

Was ändert soll diese Struktur durchgeführt werden?

Wie soll ich die Details aus dieser Tabelle in der richtigen Art und Weise angezeigt werden? (Umsetzung in jeder Sprache ist willkommen. Ich möchte nur wissen, wie es in der bestmöglichen Art und Weise zu tun)

Was sind die Sachen, die ich muß darauf achten, während Implementierung diese Funktion, so dass es weniger Belastung der CPU / Datenbank ist?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Speicher von Bäumen in einer Datenbank ist ein Thema, das viele verschiedene Lösungen. Es hängt davon ab, ob Sie eine Subhierarchie auch (so dass alle Kinder von Artikeln X) abrufen mögen, oder wenn Sie wollen einfach nur den gesamten Satz von Hierarchien greifen und den Baum in einer O (n) Art und Weise im Speicher mit einem Wörterbuch aufzubauen.

Ihre Tabelle hat den Vorteil, dass Sie alle Kommentare zu einem Post in 1 go holen können, indem Sie auf dem parentpost Filterung. Wie Sie die Bemerkung der Eltern im Lehrbuch / naive Art und Weise definiert haben, müssen Sie den Baum im Speicher bauen (siehe unten). Wenn Sie den Baum aus der DB erhalten möchten, müssen Sie einen anderen Weg, um einen Baum zu speichern: Siehe meine Beschreibung eines Pre-Calc basierten Ansatz hier: http://www.llblgen.com/tinyforum/GotoMessage.aspx?MessageID = 17746 & ThreadID = 3208 oder mit ausgewogenen Bäumen beschrieben von Celko hier :

oder noch ein anderer Ansatz: http://www.sqlteam.com/article/more-trees-hierarchies -in-sQL

Wenn Sie alles in einer Hierarchie im Speicher holen und den Baum dort zu bauen, kann es effizienter sein, aufgrund der Tatsache, dass die Abfrage ist ziemlich einfach: wählen .. von Kommentar, wo ParentPost = @id ORDER BY ParentComment ASC

Nach dieser Abfrage erstellen Sie den Baum im Speicher mit nur 1 Wörterbuch- Spur des Tupels CommentID hält - Kommentar. Sie gehen nun durch die resultset und bauen den Baum on the fly: jeden Kommentar Sie laufen in ist, wird seine parentcomment im Wörterbuch nachzuschlagen und speichern Sie dann den Kommentar aktuell bearbeiteten auch in diesem Wörterbuch.

Andere Tipps

Paar Dinge auch zu prüfen ...

1) Wenn Sie sagen, „Art wie reddit“, basierend auf Rang oder das Datum, meinen Sie das Top-Level oder die ganze Sache?

2) Wenn Sie einen Knoten löschen, was passiert mit den Zweigen? Haben Sie wieder Eltern sie? In meiner Implementierung, ich denke, dass die Redakteure entscheiden - entweder den Knoten verstecken und anzeigen als „Kommentar versteckt“, zusammen mit den sichtbaren Kindern, verstecken den Kommentar und es Kinder oder den ganzen Baum nuke. Re-Elternschaft sollte einfach sein (nur gesetzt die Eltern chidren an den Eltern gelöscht), aber es alles des ganzen Baum scheint die schwierig zu sein, in der Datenbank zu implementieren.

Ich habe Suche wurde auf der ltree Modul für PostgreSQL. Es sollte Datenbank Operationen, die Teile des Baumes ein bisschen schneller machen. Es ermöglicht im Grunde ein Feld in der Tabelle einrichten, die wie folgt aussieht:

ltreetest=# select path from test where path <@ 'Top.Science';
                path                
------------------------------------
 Top.Science
 Top.Science.Astronomy
 Top.Science.Astronomy.Astrophysics
 Top.Science.Astronomy.Cosmology

Es ist jedoch nicht gewährleistet, jede Art von referentielle Integrität auf seinem eigenen. Mit anderen Worten, können Sie eine Aufzeichnung für „Top.Science.Astronomy“ haben, ohne einen Datensatz mit für „Top.Science“ oder „Top“. Aber was es nicht lassen Sie tun, ist Sachen wie:

-- hide the children of Top.Science
UPDATE test SET hide_me=true WHERE path @> 'Top.Science';

oder

-- nuke the cosmology branch
DELETE FROM test WHERE path @> 'Top.Science.Cosmology';

Wenn mit dem traditionellen „comment_id“ / „parent_id“ -Ansatz mit gespeicherten Prozeduren kombiniert, ich denke, Sie das Beste aus beiden Welten bekommen. Sie können schnell den Kommentar Baum in der Datenbank mit Ihrem „Pfad“ durchqueren und nach wie vor die referentielle Integrität über „comment_id“ / „parent_id“ gewährleisten. Ich Vorstellungsvermögen so etwas wie:

CREATE TABLE comments (
comment_id SERIAL PRIMARY KEY,
parent_comment_id int REFERENCES comments(comment_id) ON UPDATE CASCADE ON DELETE CASCADE,
thread_id int NOT NULL  REFERENCES threads(thread_id) ON UPDATE CASCADE ON DELETE CASCADE,
path ltree NOT NULL,
comment_body text NOT NULL,
hide boolean not null default false
);

Der Pfad-String für einen Kommentar aussehen wie sein

<thread_id>.<parent_id_#1>.<parent_id_#2>.<parent_id_#3>.<my_comment_id>

So eine Wurzel des Gewindes Kommentar „102“ mit einem comment_id von „1“ würde einen Weg:

102.1

Und ein Kind, deren comment_id "3" wäre:

102.1.3

Ein paar Kinder von „3“ ids von „31“ und mit „54“ seien:

102.1.3.31
102.1.3.54

Um den Knoten „3“ und seine Kinder zu verbergen, würden Sie diese Ausgabe:

UPDATE comments SET hide=true WHERE path @> '102.1.3';

Ich weiß nicht, obwohl - es könnte unnötig Aufwand hinzufügen. Plus Ich weiß nicht, wie gut gepflegt ltree ist.

Ihr aktuelles Design ist im Grunde gut für kleine Hierarchien (weniger als tausend Artikel)

Wenn Sie auf einem certian Ebene oder Tiefe holen wollen, fügen Sie eine ‚Ebene‘ Artikel zur Struktur und berechnen sie als Teil des save

Wenn die Leistung ist ein Problem, ein anständiges Cache verwenden

würde ich die folgenden neuen Felder der obigen Tabel hinzuzufügen:

  • thread_id: Bezeichner für alle Kommentare zu einem bestimmten Objekt angebracht

  • Datum: Kommentar Datum (ermöglicht die Kommentare, um das Abrufen)

  • Rang: Kommentar Rang (ermöglicht durch die Reihung der Kommentar, um das Abrufen)

Sie diese Felder verwenden Sie in der Lage sein:

  1. holt alle Kommentare in einem Thread in einem einzigen op
  2. Um Kommentare in einem Thread entweder nach Datum oder Rang

Leider, wenn Sie Ihre Anfragen DB Nähe von SQL-Standard erhalten möchten, müssen Sie den Baum im Speicher neu erstellen müssen. Einige DBs bieten spezielle Anfragen für hierarchische Daten (F. E. Oracle)

./ alex

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top