Jag skulle gå med följande struktur:
-
Använd en samling för alla åtgärder som hände,
Actions -
Använd en annan samling för vem som följer vem,
Subscribers -
Använd en tredje samling,
Newsfeedför en viss användares nyhetsflöde fläktas artiklar ut frånActionssamling.
Newsfeed samlingen kommer att fyllas i av en arbetsprocess som asynkront bearbetar nya Actions . Därför kommer nyhetsflöden inte att fyllas i realtid. Jag håller inte med Geert-Jan i att realtid är viktigt; Jag tror att de flesta användare inte bryr sig om ens en minuts försening i de flesta (inte alla) applikationer (i realtid skulle jag välja en helt annan arkitektur).
Om du har ett mycket stort antal consumers , fan-out kan ta ett tag, sant. Å andra sidan kommer det inte att fungera att sätta in konsumenterna direkt i objektet med särskilt stora antal följare, och det kommer att skapa alltför stora objekt som tar upp mycket indexutrymme.
Men viktigast av allt är att fan-out-designen är mycket mer flexibel och tillåter relevanspoäng, filtrering etc. Jag har nyligen skrivit ett blogginlägg om nyhetsflödesschemadesign med MongoDB där jag förklarar en del av den flexibiliteten mer i detalj.
På tal om flexibilitet, jag skulle vara försiktig med den där activitystrea.ms-specifikationen. Det verkar vara vettigt som en specifikation för interop mellan olika leverantörer, men jag skulle inte lagra all den utförliga informationen i min databas så länge du inte har för avsikt att aggregera aktiviteter från olika applikationer.