2014-07-23 18 views
5

Ich bin etwas neu in NoSQL-Datenbanken (ich bin ziemlich gut mit relationalen Datenbanken though), und ich frage mich, was der effizienteste Weg, um ein Posteingangssystem mit Thread zu behandeln Nachrichten wären.MongoDB/Mongoose Schema für Threaded Messages (effizient)

Jede 'Nachricht' hat einen einzigen Absender und Empfänger. Die Anzahl der empfangenen/gesendeten Nachrichten variiert stark zwischen den Benutzern. Dieses System sollte gut auf über 1k + Benutzer skalieren.

Ich habe auf Fan-out auf schreiben/lesen gelesen, aber ich bin mir nicht sicher, wie gut das für Thread-Nachrichten funktionieren würde.

Da ich neu bei MongoDB/NoSQL bin, bin ich nicht wirklich daran gewöhnt, Daten auf diese Weise effizient zu strukturieren.

Ich vermute, es wird verschachtelte Objekte in jeder Art von effizienten Umgang mit dies ... aber ich kann mich nicht mit einem Design, das sowohl effizient und bequem für Threads Gespräche zwischen zwei Benutzern scheint.

Ich dachte an das Speichern von Daten mit einem Array der 2 Benutzer, kombiniert mit einem Array von "Nachricht" -Objekten. Aber dann gibt es das Problem der Reihenfolge der Benutzernamen der 2 Benutzer. (Bsp. [UserA, UserB] und [UserB, UserA] sind beide möglich und wären problematisch, so dass das eine schlechte Idee schien).

Ich dachte an den ganzen Fan auf Lese/Schreib-Sache, aber das scheint nicht effizient für Thread-Nachrichten (da wenn Greifen von Nachrichten nach Empfänger ist bequem, greifen Nachrichten vom Absender nicht und umgekehrt) .

Ich bin in Richtung begünstigen Greifen von Nachrichten nach Empfänger (seit der Posteingang lädt mehrere Nachrichten, und sendet nur eine [wenn auch mit einer längeren Nachschlagezeit]). Aber ich möchte wirklich eine Threading-Konversation auf einmal mitnehmen, ebenso wie die Liste der Benutzer, mit denen ein Benutzer Gespräche geführt hat (für die Liste der Threads).

Wenn mir jemand ein effizientes Schema für Thread-Konversationen geben könnte, wäre ich sehr dankbar. Ich habe das recherchiert und stundenlang versucht, mich auf ein Design festzulegen, und ich bin erschöpft. Ich finde immer wieder Fehler in meinen Entwürfen und verschrotte sie und ich würde wirklich gerne etwas Input von jemandem haben, der mehr Erfahrung mit NoSQL-Datenbanken/MongoDB hat, so dass ich es vermeiden kann, einen großen Designfehler und/oder Schreiblogik zu machen besseres Datenbankdesign

Vielen Dank im Voraus für jede und alle Hilfe.

Antwort

9

An diesem Thema sind Sie im Glück, da ein großer Beitrag ist es, die verschiedenen Ansätze für das Schema hier (es ist eine leichte Drehung auf dem, was auf Sie suchen, aber nicht viel anders) diskutieren:

http://blog.mongodb.org/post/65612078649/schema-design-for-social-inboxes-in-mongodb

Dann wurde dieses Thema auch im Detail auf MongoDB Welt 2014 in drei Teilen von Darren Holz und Asya Kamsky bedeckt:

Part 1 Outline und Video

Part 2 Outline und Video

Part 3 Outline und Video

Auch bei MongoDB Welt die Jungs von Dropbox sprach über die Lektionen, die sie gelernt, wenn ihre Mailbox Aufbau:

http://www.mongodb.com/presentations/mongodb-mailbox

Und dann, es abzurunden Es gibt eine vollständige Referenzarchitektur mit Code namens Socialite on Github, geschrieben von dem zuvor erwähnten Darren Wood:

https://github.com/10gen-labs/socialite

+0

Vielen Dank für die hilfreichen Links. Bei meinen Nachforschungen stieß ich auf die ersten und letzten. Ich denke, was meine eigentliche Frage ist, aus Gründen der Effizienz, wo sollte ich das Datenbankschema und die Logik dafür aufteilen? Sollte ich es auf eine Weise speichern, die es mir erlaubt, es aus der Datenbank bereits in einer Thread-Konversation sortiert zu bekommen .... oder sollte ich nur ein Nachrichtenschema haben und es mit serverseitiger Logik sortieren? –