Ich habe eine Website mit 500k Benutzer (auf SQL Server 2008 ausgeführt). Ich möchte jetzt Aktivitätsströme von Benutzern und ihren Freunden hinzufügen. Nach dem Testen einiger Dinge auf SQL Server wird offensichtlich, dass RDMS keine gute Wahl für diese Art von Feature ist. Es ist langsam (auch wenn ich meine Daten stark de-normalisierte). Nachdem ich mir andere NoSQL-Lösungen angesehen habe, habe ich mir gedacht, dass ich MongoDB dafür verwenden kann. Ich werde folgende Datenstruktur basierend auf activitystrea.ms json specifications for activity stream Also meine Frage ist: Was wäre das beste Schema-Design für Activity-Stream in MongoDB (mit diesen vielen Benutzern können Sie ziemlich genau sagen, dass es sehr schwer sein wird auf schreibt, daher meine Wahl von MongoDB - es hat große "writes" Leistung. Ich habe über 3 Arten von Strukturen gedacht, bitte sagen Sie mir, ob dies sinnvoll ist oder ich sollte andere Schemamuster verwenden.MongoDB Datenbank Schemadesign
1 - Speichern Sie jeweils Aktivität mit allen Freunden/Anhänger in diesem Muster:
{ _id:'activ123', actor:{ id:person1 }, verb:'follow', object:{ objecttype:'person', id:'person2' }, updatedon:Date(), consumers:[ person3, person4, person5, person6, ... so on ] }
2 - Zweiter Entwurf: Collectio n Name- activity_stream_fanout
{ _id:'activ_fanout_123', personId:person3, activities:[ { _id:'activ123', actor:{ id:person1 }, verb:'follow', object:{ objecttype:'person', id:'person2' }, updatedon:Date(), } ],[ //activity feed 2 ] }
3 - Dieser Ansatz die Aktivität Elemente in einer Sammlung zu speichern wäre, und die Verbraucher in einem anderen. In Aktivitäten, haben Sie vielleicht ein Dokument wie:
{ _id: "123", actor: { person: "UserABC" }, verb: "follow", object: { person: "someone_else" }, updatedOn: Date(...) }
Und dann, für Anhänger, würde ich die folgenden „Benachrichtigungen“ Dokumente haben:
{ activityId: "123", consumer: "someguy", updatedOn: Date(...) } { activityId: "123", consumer: "otherguy", updatedOn: Date(...) } { activityId: "123", consumer: "thirdguy", updatedOn: Date(...) }
Ihre Antworten sehr geschätzt werden.
große Vorschläge. Mit Realtime meinte ich nicht Subsecond, ich meinte nur Realtime so schnell, dass Sie nicht viel von "Batching" mehrerer Benutzeraktivitäten in Szenario 2 vom OP bekommen würden. Andererseits bin ich nicht vertraut mit dem Begriff "Fanout" (auf den sich die zweite Option des OP bezieht, und Sie erwähnen das auch), so dass ich die Absichten von 2 möglicherweise nicht vollständig verstanden habe. .. Btw: Gehen, um diesen Blogpost zu lesen, immer gut, architektonische Beiträge auf MongoDB Schema Design zu sehen –
groß zu lesen, habe ich einen Kommentar auf Ihrem Blog mit einer verwandten Frage, die Sie lesen möchten. Danke –
Jungs, vielen Dank für die Vorschläge. Ich markiere @mnemosyn Beitrag als Antwort, da es Sinn macht. Ich werde deinen Blog lesen und sehen, wo es mich hinführt. Nochmals vielen Dank ein Protokoll für alle Ihre Vorschläge. –